OpenGL 固定功能管道是不是计算视图空间中的照明?
Posted
技术标签:
【中文标题】OpenGL 固定功能管道是不是计算视图空间中的照明?【英文标题】:Does the OpenGL fixed function pipeline compute lighting in view-space?OpenGL 固定功能管道是否计算视图空间中的照明? 【发布时间】:2012-05-31 09:21:32 【问题描述】:OpenGL 固定函数管道是否计算视图空间中的光照?
如果答案是肯定的,那么它如何应对不均匀比例的视图转换?实际上,它如何处理包含任何比例的视图转换?
如果这是真的,那么缩放视图空间将导致不同的光到顶点的距离,这意味着点光源的光照强度将随着视图矩阵的缩放而改变。
世界空间中的光照将使计算的点光强度独立于视图空间缩放,但需要:
-
向 API 提供对象到世界矩阵(例如在 DirectX 中,灯光位置在世界空间中指定)。
API 在绘制时转换所有几何图形两次。一次通过 world*view*proj 进入剪辑空间,然后再次通过世界,以计算世界空间中顶点的光照。
一般情况下,您可以在固定功能照明管道上挖掘任何额外的背景信息,以获得良好的答案并获得积分。
【问题讨论】:
【参考方案1】:我认为您的问题来自“视图空间”与“投影后空间”的混淆。它们不相同。
视图空间或相机空间是场景相对于相机的空间。因此,相机位于原点,向下看 -Z 轴,+Y 向上。在OpenGL固定函数方面,相机空间是位置和法线乘以GL_MODELVIEW
矩阵后的空间。
后投影空间是相机空间值乘以GL_PROJECTION
矩阵后得到的空间。这实际上就是为什么有两个单独的矩阵。您在相机空间中进行照明,然后将投影后位置发送出去以进行光栅化。
OpenGL 不在投影后空间中进行光照。因此,纵横比、相机变焦等不会影响照明。视角也不分裂。
OpenGL 固定函数管道是否计算视图空间中的光照?
是的,你也应该这样做。
如果答案是肯定的,那么它如何应对具有非均匀比例的视图转换?实际上,它如何处理包含任何比例的视图转换?
与处理模型到世界转换并结合比例的方式完全相同。
这只是一个矩阵。数学既不知道也不关心特定比例变换发生在哪里,无论是在模型到世界的部分还是在世界到相机的部分。重要的是存在规模。或倾斜或任何其他形式的变换。
请记住:模型到世界的变换比世界到相机的变换更可能使用比例尺。您更有可能需要重新调整几何形状以适应世界,而不是需要重新调整相机矩阵的几何形状。相机缩放、纵横比等的缩放是 perspective 矩阵的一部分,而不是相机矩阵。
它以通常的方式“应对”这个问题:法线通过模型到视图矩阵的反转置进行转换。这个alters the normals(完全披露:那是我的电子书教程),这样它们在缩放后仍然适合模型。无论您在哪个空间,这都是必要的。
如果这是真的,那么缩放视图空间将导致不同的光到顶点的距离,这意味着点光源的光照强度会随着视图矩阵的缩放而改变。
... 和?由于所有对象都由 same 相机矩阵(在单个场景中)进行变换,因此所有对象都将应用相同的比例。因此,如果它们在世界空间中的比例相同,那么它们在相机空间中的比例也相同。
那么问题是什么?是的,衰减会发生变化,但它对所有对象的变化都是一样的。因此,只要您的衰减因子是针对此相机空间设计的,就没有问题。
【讨论】:
考虑一个缩放整个场景的效果(以使玩家在 FPS 游戏中看起来像是在缩小),所有光照距离都会改变,从而影响光照方程。如果在世界空间中进行光照,这将不会发生。谢谢你的回答。 @infact:你不会缩放世界以使玩家看起来正在缩小。你会画出玩家更小。您会将相机移近地面等等。根本不需要比例矩阵。 也许那是一个不好的例子。但是考虑合并Scale的视图转换是否不合理?对这种变换进行动画处理会揭示视图空间照明的差异。 @infact:我可以很容易地说这个世界需要一个比例变换,这将在光照期间“揭示差异”。如果您的场景的衰减很重要,那么您可以在该场景中保持距离的一致性。照明通常在相机空间中完成,所以很明显,这没什么大不了的。以上是关于OpenGL 固定功能管道是不是计算视图空间中的照明?的主要内容,如果未能解决你的问题,请参考以下文章