6

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

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

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

4

2 回答 2

2

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

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

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

于 2008-09-16T12:44:27.377 回答
0

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

于 2008-09-16T12:53:55.247 回答