1

我目前正在尝试实现需要有“切线空间”的凹凸贴图。我通读了一些教程,特别是以下两个:

两个教程都避免在片段着色器中进行昂贵的矩阵计算,如果阴影计算照常发生在相机空间中(至少我已经习惯了),这将是必需的。

它们引入了切线空间,每个顶点可能不同(如果表面平滑,甚至每个片段)。如果我理解正确,为了有效的凹凸映射(即最小化片段着色器中的计算),他们使用顶点着色器将光计算所需的一切转换到这个切线空间。但我想知道模型空间是否是计算光照着色的好选择。

我关于这个话题的问题是:

  • 对于切线空间中的着色计算,我在顶点着色器和片段着色器之间究竟传递了什么?我真的需要转换切线空间中的灯光位置,需要O(number of lights)不同的变量吗?例如,这不适用于延迟着色,或者如果由于顶点着色器中的某些其他原因不知道灯光位置。必须有一个(仍然有效的)替代方案,我猜这是模型空间中的着色计算。

  • 如果我通过模型空间变化,是否仍然在切线空间中执行着色计算是一个好主意,即在片段着色器中转换光位置?还是在模型空间中执行着色计算更好?哪个会更快?(在这两种情况下,我都需要一个 TBN 矩阵,但一种情况需要模型到切线的变换,另一种是切线到模型的变换。)

  • 我目前将每个顶点法线、切线和双切线(正交法线)传递给顶点着色器。如果我理解正确,则仅当我想快速构建模型到切线空间矩阵时才需要正交化,该矩阵需要反转包含 TBN 向量的矩阵。如果它们是正交的,这只是一个转置。但是,如果我不需要切线空间中的向量,我不需要求逆,而只需要矩阵中的原始 TBN 向量,然后是模型的切线矩阵。这不会简化一切吗?

4

1 回答 1

3

法线贴图通常在切线空间中完成,因为法线贴图是在该空间中给出的。因此,如果您在顶点着色器中将(相对较少的)输入数据预转换为切线空间,则不需要在片段着色器中进行额外计算。当然,这要求所有输入数据都可用。我还没有使用延迟着色进行凹凸贴图,但使用模型空间似乎是个好主意。世界空间可能会更好,因为您最终需要世界空间向量来渲染到 G 缓冲区。

如果您传递模型空间向量,我建议在此空间中执行计算。然后片段着色器必须将一个法线从切线空间转换到模型空间。在另一种情况下,它必须将n 个光照属性从模型空间转换到切线空间,这需要n倍的时间。

如果您不需要逆 TBN 矩阵,则非正交坐标系应该没问题。至少我没有看到任何理由,为什么它不应该。

于 2013-10-10T14:38:56.657 回答