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 固定功能管道是不是计算视图空间中的照明?的主要内容,如果未能解决你的问题,请参考以下文章

openGL中的法向量问题

OpenGL如何使用固定管线下的着色器渲染一个正方形,并用特殊键控制移动

OpenGL的视图变换与OSG漫游器

现代opengl渲染管道

固定功能vs基于着色器

✠OpenGL-3-数学基础