OpenGL固定功能管道是否在视图空间中计算照明?

时间:2012-05-31 09:21:32

标签: opengl 3d lighting

OpenGL固定功能管道是否在视图空间中计算照明?

如果答案是肯定的,那么它如何应对具有非均匀比例的视图转换?实际上,它如何处理包含任何比例的视图转换?

如果这是真的,那么缩放视图空间将导致不同的光到顶点距离,这意味着点光源的光照强度将随着视图矩阵的缩放而改变。

世界空间中的照明会使计算出的点光强度与视图空间缩放无关,但需要:

  1. 向API提供了一个对象 - 世界矩阵(例如在DirectX中,在世界空间中指定了灯光位置)。
  2. 绘制时API会将所有几何体转换两次。一次通过世界*视图* proj进入剪辑空间,再次通过世界,以计算世界空间顶点的光照。
  3. 通过固定功能照明管道可以深入了解任何其他背景信息,获得良好答案的分数。

1 个答案:

答案 0 :(得分:4)

我认为你的问题来自于“观看空间”与“投影后空间”的混淆。它们相同。

查看空间或相机空间是场景相对于相机的空间。因此,相机坐在原点,向下看-Z轴,+ Y向上。就OpenGL固定功能而言,相机空间是将GL_MODELVIEW矩阵乘以位置和法线之后的空间。

投影后空间是将摄像机空间值乘以GL_PROJECTION矩阵后获得的空间。这实际上是为什么有两个单独的矩阵。您在相机空间中进行照明,然后关闭投影后位置以进行光栅化。

OpenGL不会在投影后空间中进行照明。因此,宽高比,相机变焦等等会影响照明。这种观点也没有分歧。

  

OpenGL固定功能管道是否在视图空间中计算照明?

是的,你也应该这样。

  

如果答案是肯定的,那么它如何应对具有非均匀比例的视图转换?实际上,它如何处理包含任何比例的视图转换?

与处理包含比例尺的模型到世界的变换完全相同。

这只是一个矩阵。数学既不知道也不关心特定尺度变换的位置,无论是在模型到世界的部分还是在世界到相机的部分。重要的是存在规模。或者是倾斜或任何其他形式的变换。

请记住:模拟世界变换使用尺度比世界到相机变换更可能。您可能需要重新缩放几何体以适应世界,而不是需要重新缩放相机矩阵的几何体。相机缩放比例,宽高比等是透视矩阵的一部分,而不是相机矩阵。

它以通常的方式“应对”:通过模型到视图矩阵的逆转换来转换法线。这个alters the normals(完全披露:这是我的电子书教程),以便在缩放后它们仍适合模型。无论你在什么位置,这都是必要的。

  

如果这是真的,那么缩放视图空间将导致不同的光到顶点距离,这意味着点光源的光照强度将随着视图矩阵的缩放而改变。

......和?由于所有对象都由相同的相机矩阵(在单个场景中)进行变换,因此所有对象都将应用相同的比例。因此,如果它们在世界空间中都处于相同的比例,它们在相机空间中都将处于相同的比例。

那么问题是什么?是的,衰减会发生变化,但所有物体的衰减都会相同。因此,只要您的衰减系数是针对此摄像机空间设计的,就没有问题。