为什么我们应该在OpenGL管道的片段阶段进入眼睛空间坐标?

Tux*_*xer 9 c++ opengl shader

我正在编写一个小型3D引擎,我想知道为什么我应该进入片段着色器中的眼睛空间坐标.要做到这一点,我必须将我的相机矩阵放在制服中以转换眼坐标中的光位置,并将camera_normal矩阵放在眼坐标中.为什么每个人都使用这些坐标?我没有看到任何优势,所以如果你能帮我理解这个选择,我将不胜感激.谢谢 :)

Nic*_*las 7

使用眼睛空间有几个原因:

  1. 很方便.它是一个存在明确定义的空间,也是您在转换位置的过程中计算出来的空间.
  2. 它具有与世界空间相同的比例,但没有世界空间的问题.眼睛空间始终(相对)接近于零(因为眼睛处于0),因此它具有用于具有显式变换矩阵的合理空间.比例很重要,因为您可以提供在世界空间中计算的距离(如光衰减项).眼睛空间的距离不会改变.
  3. 无论如何,您需要将其转换为线性空间.在像投影后空间这样的非线性空间中进行照明,特别是注意事项,是非常棘手的.所以你必须在某种线性空间中提供法线和位置,所以它也可能是眼睛空间.
  4. 它需要最少的变换.眼睛空间是投影变换前的空间.如果必须反向变换为线性空间(例如,延迟渲染),则眼睛空间需要最少的操作.