SharpDX。照明问题

时间:2013-01-26 03:59:47

标签: c# directx lighting 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(device,“MiniCube.fx”,ShaderFlags.None);

它的含义是什么?我不想要任何效果..(它来自SharpDX示例源.MiniCube.csproj)

2 个答案:

答案 0 :(得分:0)

我自己并不熟悉SharpDX,因为它是C#的DX包装器。虽然这是一个很酷的概念,但如果您不熟悉DirectX的工作方式,我会警告不要使用它。据我所知,由于DirectX本身已经拥有大量的示例和文档,因此SharpDX人员故意提供非常少的文档。

要触摸效果,它们是处理着色器逻辑的对象。着色器是直接与GPU连接的“迷你程序”。现代游戏中的大部分内容都是通过着色器(包括灯光)进行编写,显示,倾斜,变形,更改甚至移动! HLSL(或高级着色器语言)是DirectX接口的标准语言。具有讽刺意味的是,找到简单的着色器教程或示例可能相当困难,而更复杂的细节却被很好地映射出来。

虽然这些对您的眼前需求可能并不是特别有用,但这是我最喜欢的HLSL材料资源。

DirectXTutorial.com

JaJDoo

除了微软最近宣布弃用的D3DX库(混蛋)之外,DXTutorial对于通过C ++学习DX几乎没有任何依赖性是惊人的。它还有一个名义上的50美元的高级内容费用(我相信包括着色器),但是当我说他以50美元卖空时,请相信我。

JaJDoo的教程本身就很出色,但是他们以Ogre图形框架为目标,所以你需要对代码做一些改动,因为Ogre使用自定义着色器管道来改变你定义和调用技术和传递的方式,找出IMO并不是什么大不了的事。

话虽如此,我知道我实际上没有回答你的问题。但是我会敦促你退出SharpDX并学习基础知识。可能有其他人不同意我的观点,但对我来说似乎有点倒退。祝你好运!

答案 1 :(得分:0)

如果要使用照明,则顶点格式应包含VertexFormat.Normal。如果没有法线,则DirectX无法计算照明。