【发布时间】:2014-04-24 23:51:53
【问题描述】:
我正在我的 OpenGL 应用程序中实现切线空间法线映射,我有几个问题。
1) 我知道,自然地,TBN 矩阵并不总是正交的,因为纹理坐标可能有倾斜。我知道您可以使用 Gramm-Schmidt 过程对其进行重新正交化。我的问题是——Gramm-Schmidt 过程是否会引入可见的伪影?使用未经修改的纯法线/切线/双切线可以获得最佳视觉质量吗?
2) 我注意到在很多教程中,他们在切线空间而不是视图空间中进行光照计算。为什么是这样?我打算使用延迟渲染器,所以我的法线必须保存到缓冲区中,我是否正确,因为它们在保存时应该在视图空间中?在计算中使用视图空间而不是切线空间会错过什么?如果我使用的是视图空间,是否需要 TBN 矩阵的逆矩阵?
3) 在片段着色器中,切线和副切线是否必须重新归一化?在乘以传入(归一化)凹凸贴图法线之后,是否必须重新归一化?正交性(见问题 1)会影响这个吗?在片段着色器中哪些向量需要或不需要重新规范化?
【问题讨论】:
-
对于延迟着色,通常在编写普通 G-Buffer 时执行切线空间到世界/视图空间的转换。一些后处理算法在世界空间中效率更高,因此一些引擎将其存储在世界空间中。视图空间在精度方面也有一些优势,所以对于做什么没有达成共识......但你绝对不能将你的 G-Buffer 存储在切线空间中,因为会丢失转换法线所需的信息在照明期间。
-
谢谢,我现在将它们存储在视图空间中,但将来可能会更改为世界空间。
标签: c++ opengl glsl normals bump-mapping