1

我正在使用 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;

但是,什么都没有改变。

图像: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)

4

2 回答 2

1

除了它是 C# 的 DX 包装器这一事实之外,我本人并不熟悉 SharpDX。虽然是一个很酷的概念,但如果您不熟悉 DirectX 的工作原理,我会警告您不要使用它。据我了解,SharpDX 家伙故意提供很少的文档,因为 DirectX 本身已经有大量的示例和文档。

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

尽管这些对于您的即时需求可能不是特别有用,但这里是我最喜欢的两个 HLSL 材料资源。

DirectXTutorial.com

贾JDoo

DXTutorial 非常适合通过 C++ 学习 DX,几乎没有依赖项,除了微软最近宣布弃用的 D3DX 库(混蛋)。它还为高级内容收取 50 美元的象征性费用(我相信这包括着色器),但当我说他以 50 美元卖空自己时请相信我。

JaJDoo 的教程本身就很出色,但是它们针对的是 Ogre 图形框架,因此您需要对代码进行一些更改,因为 Ogre 使用自定义着色器管道来改变您定义和调用技术和传递的方式,而不是一个巨大的处理找出IMO。

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

于 2013-02-05T18:25:08.203 回答
0

如果你想使用光照,你的顶点格式应该包括VertexFormat.Normal. 如果没有法线,DirectX 就无法计算光照。

于 2018-09-23T10:39:02.287 回答