【问题标题】:SharpDX. trouble with lighting夏普DX。照明问题
【发布时间】:2018-09-23 18:39:02
【问题描述】:

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

【问题讨论】:

  • 没有使用原始 DX(或 SharpDX),但效果只是 DirectX 对一组着色器(用 HLSL 编写)的花哨术语。着色器通常用于创建照明(本质上,它们是在 GPU 上为每个顶点和像素运行一次的小程序)。

标签: c# directx lighting sharpdx


【解决方案1】:

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

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

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

DirectXTutorial.com

JaJDoo

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

JaJDoo 的教程本身就很出色,但是它们针对的是 Ogre 图形框架,因此您需要对代码进行一些更改,因为 Ogre 使用自定义着色器管道,它会改变您定义和调用技术和通道的方式,弄清楚 IMO 并不是什么大不了的事。

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

【讨论】:

  • 我不同意。如果不是托管包装器,我就不会开发 Direct3D 应用程序。不得不学习 C++ 会从一开始就把我吓跑。
  • 每个人都有。你用了什么资源?我想那里有很多书,但我没有研究任何东西,因为网络资源似乎很稀缺,所以我坚持我所知道的
  • MSDNRastertek TutorialsSlimDX、其他各种网站以及我在使用 XNA 时获得的知识。不过,通过网络资源学习所有内容确实不容易。虽然我不会编写 C++,但我确实学会了如何将它翻译成 C#。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-20
    • 2011-06-24
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    • 2019-06-22
    相关资源
    最近更新 更多