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

why should we go in eye-space coordinates during fragment stage in the OpenGL pipeline?

本文关键字:段使用 空间 坐标 片段 我们 OpenGL 管道 为什么      更新时间:2023-10-16

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

为什么每个人都用这些坐标?

使用眼距有几个原因:

  1. 这是方便的。这是一个存在的定义良好的空间,并且无论如何都要在转换位置的过程中计算。
  2. 它具有与世界空间相同的规模,但不存在世界空间所存在的问题。眼空间总是(相对地)接近于零(因为眼在0处),所以对于具有显式变换矩阵的空间是合理的。尺度很重要,因为您可以提供在世界空间中计算的距离(如光衰减项)。距离不会随着眼距而改变。
  3. 你需要把它转换成一个线性空间。在一个非线性的空间,比如后投影空间中进行照明,尤其是有衰减的照明……棘手。所以你必须在某种线性空间中提供法线和位置,所以它也可能是眼空间。
  4. 它需要最少的转换。眼空间是投影变换之前的空间。如果你必须反向转换到线性空间(例如延迟渲染),眼空间是需要最少操作的。

你不需要向着色器提供相机矩阵并在那里进行光的位置和方向转换。实际上这样做效率很低,因为你对每个顶点都在对同样的数字做同样的操作。

只是转换光的位置和方向CPU侧,并提供容易转换的光参数到着色器。然而,在眼空间照明计算仍然更简洁,特别是如果涉及法线映射。但是无论如何,您必须将所有内容转换为眼空间,因为法线不会通过透视转换进行转换(尽管顶点位置可以直接转换为剪辑空间)。