如何使用Direct3D使灯光始终固定在世界上

时间:2020-03-05 18:55:46  来源:igfitidea点击:

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

在OpenGL中,光照位置的变换与使用MODELVIEW矩阵进行的所有其他操作一样,因此要在空间中固定光照,请以所需的光照方式设置MODELVIEW,然后调用glLightPosition进行几何设置并进行几何调用。在D3D中这无济于事。

(评论-我最终想出了这个答案,但是我找不到任何在Web或者MSDN上有用的答案。如果那时我能找到这个答案,那将节省我几个小时的时间。)

解决方案

回答

我最终发现的答案是,虽然OpenGL仅具有一个合并的" MODELVIEW"矩阵,但在D3D中,"世界"和"视图"变换保持分离,因此放置灯光似乎是主要原因。因此答案是,我们可以使用" D3DTS_VIEW"设置应应用于灯光的矩阵,并使用" D3DTS_WORLD"设置适用于几何图形在世界上放置的矩阵。

因此,实际上,D3D系统比OpenGL方式更有意义。它使我们可以随时随地指定自己想要的灯光位置,而不必一直重新定位它们,以便它们通过当前的"视图"变换而变换。 OpenGL必须以这种方式工作,因为它根本不知道我们认为"视图"与"模型"之间的关系。这只是GL的模型视图。

(如果我不应该在这里回答自己的问题,请对此表示歉意,但这是我几个星期前遇到的一个真实问题,我认为值得在此发布以帮助其他人从OpenGL过渡到D3D。 D3D照明和渲染管道似乎很难实现。)

回答

对于固定功能管道,在世界空间中设置灯光位置和方向。轻型结构的文档确实告诉我们这一点,但是我们在文档中错过了它,我并不感到惊讶。固定功能管道上的信息已经很少,因为重点是可编程着色器。