我正在使用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)
答案 0 :(得分:0)
我自己并不熟悉SharpDX,因为它是C#的DX包装器。虽然这是一个很酷的概念,但如果您不熟悉DirectX的工作方式,我会警告不要使用它。据我所知,由于DirectX本身已经拥有大量的示例和文档,因此SharpDX人员故意提供非常少的文档。
要触摸效果,它们是处理着色器逻辑的对象。着色器是直接与GPU连接的“迷你程序”。现代游戏中的大部分内容都是通过着色器(包括灯光)进行编写,显示,倾斜,变形,更改甚至移动! HLSL(或高级着色器语言)是DirectX接口的标准语言。具有讽刺意味的是,找到简单的着色器教程或示例可能相当困难,而更复杂的细节却被很好地映射出来。
虽然这些对您的眼前需求可能并不是特别有用,但这是我最喜欢的HLSL材料资源。
除了微软最近宣布弃用的D3DX库(混蛋)之外,DXTutorial对于通过C ++学习DX几乎没有任何依赖性是惊人的。它还有一个名义上的50美元的高级内容费用(我相信包括着色器),但是当我说他以50美元卖空时,请相信我。JaJDoo的教程本身就很出色,但是他们以Ogre图形框架为目标,所以你需要对代码做一些改动,因为Ogre使用自定义着色器管道来改变你定义和调用技术和传递的方式,找出IMO并不是什么大不了的事。
话虽如此,我知道我实际上没有回答你的问题。但是我会敦促你退出SharpDX并学习基础知识。可能有其他人不同意我的观点,但对我来说似乎有点倒退。祝你好运!
答案 1 :(得分:0)
如果要使用照明,则顶点格式应包含VertexFormat.Normal
。如果没有法线,则DirectX无法计算照明。