directx - 如何使用 Direct3D 使灯光在世界中保持固定

标签 directx direct3d lighting

我已经使用 OpenGL 多年了,但是在第一次尝试使用 D3D 之后,我浪费了大量时间试图弄清楚如何让我的场景灯光在世界上保持固定而不是固定在我的对象上。

在 OpenGL 中,灯光位置就像使用 MODELVIEW 矩阵的其他所有内容一样进行转换,因此为了将灯光固定在空间中,您可以按照您想要的灯光方式设置 MODELVIEW,然后调用 glLightPosition,然后为您的几何体设置它并进行几何体调用.在 D3D 中,这无济于事。

(评论——我最终找到了这个问题的答案,但我在网络或 MSDN 上找不到任何有用的东西。如果我当时能找到这个答案,它会为我节省几个小时的头脑 Storm 。 )

最佳答案

我最终发现的答案是,虽然 OpenGL 只有一个合并 MODELVIEW矩阵,在 D3D 中,“世界”和“ View ”变换是分开的,而放置灯光似乎是造成这种情况的主要原因。所以答案是你使用 D3DTS_VIEW设置适用于您的灯光的矩阵,以及 D3DTS_WORLD设置适用于您的几何体在世界中的位置的矩阵。

所以实际上 D3D 系统比 OpenGL 方式更有意义。它允许您随时随地指定您想要一劳永逸的灯光位置,而不必不断地重新定位它们,以便它们通过您当前的“ View ”变换进行变换。 OpenGL 必须以这种方式工作,因为它根本不知道您认为您的“ View ”与“模型”是什么。这只是 GL 的模型 View 。

(评论 - 如果我不应该在这里回答我自己的问题,我深表歉意,但这是我几周前提出的一个真实问题,我认为值得在这里发布以帮助其他人从 OpenGL 转向 D3D。基本概述D3D 照明和渲染管道的内容似乎很难获得。)

关于directx - 如何使用 Direct3D 使灯光在世界中保持固定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71720/

相关文章:

opengl - 在 LWJGL 中绘制法线会与光照混淆

c++ - OpenGL 中的照明问题

c++ - 无法打开包含文件 : 'iProxyTrans.h' - old Directshow project?

windows - Direct3DCreate9Ex 在作为 Windows 服务运行时返回 D3DERR_NOTAVAILABLE (0x8876086a)

direct3d - 无法从 dx12 中的 ID3D12Device 获取 IDXGIDevice 或 IDXGIDevice1

c - OpenGL 光照具有明亮的表面

c++ - 如何从 ID3DXEffect 获取所有着色器常量(统一)?

c++ - 为什么 DirectX 每隔一个着色器调用就会跳过一次?

c++ - 如何使用 D3DPT_TRIANGLESTRIP 基元类型在 DirectX 中绘制两个分离的矩形

3d - XNA 中窗口系统的渲染策略(RenderTarget 性能)