C++ 为什么我们要在OpenGL管道中的片段阶段使用眼睛空间坐标?

C++ 为什么我们要在OpenGL管道中的片段阶段使用眼睛空间坐标?,c++,opengl,shader,C++,Opengl,Shader,我目前正在编程一个小型3D引擎,我想知道为什么我应该在片段着色器中使用眼睛空间坐标。要做到这一点,我必须把我的相机矩阵放在一个统一的坐标系中,以转换眼睛坐标系中的光线位置,把相机矩阵放在眼睛坐标系中的光线方向 为什么每个人都使用这些坐标?我看不出有什么好处。您不必向着色器提供摄影机矩阵,也不必在那里进行灯光位置和方向变换。实际上,这样做效率很低,因为对于每个顶点,对同一个数字反复执行相同的操作 只需在CPU端变换灯光位置和方向,并将容易变换的灯光参数提供给着色器。然而,在眼睛空间中,照明计算仍然

我目前正在编程一个小型3D引擎,我想知道为什么我应该在片段着色器中使用眼睛空间坐标。要做到这一点,我必须把我的相机矩阵放在一个统一的坐标系中,以转换眼睛坐标系中的光线位置,把相机矩阵放在眼睛坐标系中的光线方向


为什么每个人都使用这些坐标?我看不出有什么好处。

您不必向着色器提供摄影机矩阵,也不必在那里进行灯光位置和方向变换。实际上,这样做效率很低,因为对于每个顶点,对同一个数字反复执行相同的操作


只需在CPU端变换灯光位置和方向,并将容易变换的灯光参数提供给着色器。然而,在眼睛空间中,照明计算仍然更加简洁,特别是在涉及法线贴图的情况下。但无论如何,您都必须将所有内容转换为眼睛空间,因为透视变换不会转换法线(尽管顶点位置可以直接转换为剪辑空间)。

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

  • 很方便。这是一个定义良好的空间,你可以在变换位置的过程中进行计算
  • 它与世界空间的比例相同,但没有世界空间的问题。眼睛空间总是(相对地)接近于零(因为眼睛处于0),所以它是一个合理的空间,可以为眼睛提供一个显式的变换矩阵。比例很重要,因为可以提供在世界空间中计算的距离(如光衰减项)。眼睛空间中的距离不会改变
  • 你需要把它转换成一个线性空间。在非线性空间(如投影后空间)中进行照明,尤其是在注意力集中的情况下,是。。。棘手的所以你必须在某种线性空间中提供法线和位置,所以它也可以是眼睛空间
  • 它需要最少的变换。眼睛空间是投影变换之前的空间。如果必须反向变换到线性空间(例如,延迟渲染),则眼睛空间是需要最少操作的空间