SharpDX. беда с освещением

Я использую SharpDX d3d9 для создания сферы с эффектом освещения.

Итак, я попробовал код ниже.

 var direct3D = new Direct3D();
 var device = new SharpDX.Direct3D9.Device(direct3D, 0, SharpDX.Direct3D9.DeviceType.Hardware, this.Handle, CreateFlags.HardwareVertexProcessing,
 new PresentParameters(this.ClientSize.Width, this.ClientSize.Height));
 Light light = new Light();
 light.Type = LightType.Point;

 light.Diffuse.Red = 1.0f;
 light.Diffuse.Green = 1.0f;
 light.Diffuse.Blue = 1.0f;
 light.Diffuse.Alpha = 0.7f;

 light.Position = new Vector3(-10, -10, -10);

 light.Range = 200.0f;
 light.Attenuation0 = 0.1f;

 device.SetRenderState(RenderState.Lighting, true);
 device.SetRenderState(RenderState.Ambient, new Color4(0.5f, 0.5f, 0.5f, 0.5f).ToRgba());

 device.SetLight(0, ref light);
 device.EnableLight(0, true);

 Material met = new Material();
 met.Diffuse = new Color4(1, 1, 1, 1);
 met.Ambient = new Color4(1, 1, 1, 1);
 met.Specular = new Color4(1, 1, 0, 1);
 met.Emissive = new Color4(0, 0, 0, 1);
 met.Diffuse.Alpha = 0.7f;
 met.Power = 5.0f;

 device.Material = met;

но ничего не изменилось.

img: http://cfile24.uf.tistory.com/image/156A994C5103547E273035

(цвета - это введенные мной значения.)

код рендеринга

 RenderLoop.Run(this, () => {
            var time = clock.ElapsedMilliseconds / 1000.0f;

            device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Black, 1.0f, 0);
            device.BeginScene();

            effect.Technique = technique;
            effect.Begin();
            effect.BeginPass(0);

            var worldViewProj = Matrix.RotationX(time) * Matrix.RotationY(time * 2) * Matrix.RotationZ(time * .7f) * viewProj;
            effect.SetValue("worldViewProj", worldViewProj);
            //effect.SetValue("worldViewProj", viewProj);

            //device.DrawPrimitives(PrimitiveType.LineList, 0, counts / 2);
            device.DrawPrimitives(PrimitiveType.TriangleList, 0, counts / 3);

            effect.EndPass();
            effect.End();

            device.EndScene();
            device.Present();
        });

Как я могу применить свет к своему приложению?

и,

var effect = Effect.FromFile(устройство, "MiniCube.fx", ShaderFlags.None);

Какая доза означает эффект? Однако я не хочу никакого эффекта .. (Это исходный код SharpDX. MiniCube.csproj)


person Flask_KR    schedule 26.01.2013    source источник
comment
Не использовал raw DX (или SharpDX), но эффект — это просто причудливый термин DirectX для набора шейдеров (написанных на HLSL). Шейдеры — это то, что обычно используется для создания освещения (по сути, это небольшие программы, которые запускаются на графическом процессоре один раз для каждой вершины и пикселя).   -  person Cameron    schedule 26.01.2013


Ответы (2)


Я сам не знаком с SharpDX, кроме того факта, что это оболочка DX для C#. Хотя это классная концепция, я бы предостерег от ее использования, если вы не знакомы с тем, как работает DirectX. Насколько я понимаю, ребята из SharpDX намеренно предоставляют очень мало документации из-за того, что сам DirectX уже имеет огромное количество примеров и документов.

Если говорить об эффектах, то это объекты, которые обрабатывают логику шейдера. Шейдеры — это «мини-программы», которые напрямую взаимодействуют с графическим процессором. Почти все в современных играх записывается, отображается, искажается, трансформируется, изменяется или даже перемещается с помощью шейдеров, включая освещение! HLSL (или язык шейдеров высокого уровня) — это стандартный язык для интерфейсов DirectX. По иронии судьбы, может быть довольно сложно найти простые учебники или примеры шейдеров, в то время как более сложные детали довольно хорошо расписаны.

Хотя они могут быть не особенно полезны для ваших непосредственных потребностей, вот два моих любимых ресурса для материала HLSL.

DirectXTutorial.com

JaJDoo

DXTutorial отлично подходит для изучения DX через C++ практически без каких-либо зависимостей, за исключением библиотеки D3DX, которую Microsoft недавно объявила устаревшей (ублюдки). У него также есть номинальная плата в размере 50 долларов за премиум-контент (я полагаю, что это включает в себя шейдеры), но поверьте мне, когда я говорю, что он продает себя за 50 долларов.

Учебники JaJDoo превосходны сами по себе, однако они ориентированы на графическую среду Ogre, поэтому вам нужно будет внести некоторые изменения в код, поскольку Ogre использует собственный конвейер шейдеров, который изменяет способ определения и вызова методов и проходов, а не огромный сделка, чтобы выяснить ИМО.

При этом я понимаю, что на самом деле не ответил на ваш вопрос. Однако я призываю вас отказаться от SharpDX и изучить основы. Могут быть и другие, кто не согласен с моим мнением, но мне оно кажется немного отсталым. В любом случае удачи!

person Mike H.    schedule 05.02.2013
comment
Я вынужден не согласиться. Если бы не управляемые оболочки, я бы не разрабатывал приложения Direct3D. Необходимость изучения C++ отпугнула бы меня с самого начала. - person Lucius; 06.02.2013
comment
каждому свое. какие ресурсы вы использовали? Я полагаю, что есть много книг, но я ничего не изучал, так как веб-ресурсы казались скудными, поэтому я остановился на том, что знаю. - person Mike H.; 09.02.2013
comment
MSDN, Учебники по Rastertek, SlimDX, различные другие сайты и знания, полученные при работе с XNA. Хотя, конечно, было не так-то просто научиться всему через веб-ресурсы. И хотя я не умею писать C++, я определенно научился переводить его на C#. - person Lucius; 09.02.2013

Если вы хотите использовать освещение, формат вершины должен включать VertexFormat.Normal. Если нормалей нет, освещение не может быть рассчитано с помощью DirectX.

person Maxence    schedule 23.09.2018