我目前正在编写一个小型的3D引擎,我想知道为什么在片元着色器中要使用视点空间坐标。为了做到这一点,我必须将我的相机矩阵放入一个统一的变量中,以将光源位置转换为视点坐标,并使用相机法线矩阵将光源方向放入视点坐标。 为什么每个人都使用这些坐标?我真的没有看到任何优势。
使用眼空间的原因有几个: 方便。这是一个明确定义的空间,而且在转换位置时你已经计算出来了。 它与世界空间具有相同的比例尺度,但没有世界空间的问题。眼空间始终(相对地)靠近零点(因为眼睛在0点),因此它是一个合理的具有显式变换矩阵的空间。比例尺很重要,因为你可以提供在世界空间中计算的距离(如光衰减项)。在眼空间中距离不会改变。 你需要将其转换为线性空间。在非线性空间(如后投影空间)进行照明特别是衰减的处理是困难的。所以你必须提供一些线性空间中的法线和位置,那么最好就是眼空间。 它需要最少的变换。眼空间是投影变换之前的空间。如果你需要反向转换到线性空间(例如延迟渲染),眼空间需要的操作最少。
您无需在着色器中提供相机矩阵并对光源位置和方向进行转换。实际上,这种做法效率相当低下,因为您需要针对每个顶点再次执行完全相同的操作。 直接在CPU端转换光源位置和方向,并提供已转换的光参数给着色器即可,这样更加高效。然而,如果涉及法线映射,灯光计算仍然更简洁地使用眼空间。但是无论如何,您都必须将所有内容转换为眼空间,因为透视变换不会转换法线(虽然顶点位置可以直接转换为剪辑空间)。