1

我正在我的 OpenGL 应用程序中实现切线空间法线映射,我有几个问题。

1)我知道,自然地,TBN 矩阵并不总是正交的,因为纹理坐标可能有倾斜。我知道您可以使用 Gramm-Schmidt 过程对其进行重新正交化。我的问题是——Gramm-Schmidt 过程是否会引入可见的伪影?通过使用纯未修改的法线/切线/双切线,我会获得最佳的视觉质量吗?

2)我注意到在很多教程中,他们在切线空间而不是视图空间中进行照明计算。为什么是这样?我打算使用延迟渲染器,所以我的法线必须保存到缓冲区中,我是否正确,因为它们在保存时应该在视图空间中?在计算中使用视图空间而不是切线空间会错过什么?如果我使用视图空间,是否需要 TBN 矩阵的逆矩阵?

3)在片段着色器中,切线和副切线是否必须重新归一化?在乘以传入(归一化)凹凸贴图法线之后,是否必须重新归一化?正交性(见问题 1)会影响这个吗?在片段着色器中哪些向量需要或不需要重新规范化?

4

1 回答 1

3

Gramm-Schmidt 过程是否会引入可见伪影?

这取决于期望的结果。但通常的答案是肯定的,因为法线贴图向量位于切线空间中。如果纹理坐标定义了非正交基础,则正交切线空间将扭曲法线贴图计算。

我注意到在很多教程中,他们在切线空间而不是视图空间中进行光照计算。为什么是这样?

在视图空间中进行法线贴图需要将每个法线贴图纹素转换到视图空间中。这比在顶点着色器中将光照向量转换为切线空间并让重心插值阶段(效率更高)来工作更昂贵。

在片段着色器中,切线和副切线是否必须重新归一化?

不,您应该在转换它们(法线贴图、光源方向和视点)之后但在进行照明计算之前对各个向量进行归一化。

于 2014-04-25T00:05:31.387 回答