我在我的OpenGL应用程序中实现切线空间法线贴图,我有几个问题。
1)我知道,当然,TBN矩阵并不总是正交的,因为纹理坐标可能有偏差。我知道你可以使用Gramm-Schmidt工艺重新正交化它。我的问题是 - Gramm-Schmidt过程是否会引入可见的伪像?通过使用纯的未修改的法线/切线/比特直接,我能获得最佳的视觉质量吗?
2)我注意到在许多教程中,他们在切线空间而不是视图空间中进行光照计算。为什么是这样?我打算使用延迟渲染器,所以我的法线必须保存到缓冲区中,我是否正确,因为它们应该在保存时位于视图空间中?通过在计算中使用视图空间而不是切线空间,我会错过什么?如果我使用视图空间,我是否需要TBN矩阵的反转?
3)在片段着色器中,是否必须重新规范化切线和bitangent?将输入(标准化)凹凸贴图正常乘以后,是否必须重新规范化?正交性(见问题1)会影响这个吗?哪些向量在片段着色器中是否需要重新规范化?
答案 0 :(得分:3)
Gramm-Schmidt过程是否会引入可见的伪影?
这取决于期望的结果。但通常的答案是肯定的,因为法线贴图在切线空间中。如果纹理坐标定义非正交基础,则正交化切线空间将偏向法线贴图计算。
我注意到在许多教程中,他们在切线空间而不是视图空间中进行光照计算。这是为什么?
在视图空间中进行法线贴图需要将每个法线贴图纹素转换为视图空间。这比在顶点着色器中将光照矢量转换为切线空间并让重心插值阶段(效率更高)更加昂贵。
在片段着色器中,是否必须重新标准化切线和比特?
没有。您应该在对各个矢量进行变换后将其标准化(法线贴图,光源和视点的方向),然后再进行光照计算。