【问题标题】:Normal Mapping Questions法线映射问题
【发布时间】: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


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-24
    • 2019-01-22
    • 2011-07-28
    相关资源
    最近更新 更多