模型,切线或相机空间中的光计算(阴影)?

时间:2013-10-10 13:17:53

标签: opengl glsl shader linear-algebra bump-mapping

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

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

它们引入了每个顶点可能不同的切线空间(如果曲面被平滑,甚至每个碎片也是如此)。如果我理解正确,为了有效的凹凸贴图(即最小化片段着色器中的计算),他们使用顶点着色器将光计算所需的所有内容转换为此切线空间。但我想知道模型空间是否是计算光着色的好方法。

我对此主题的疑问是:

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

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

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

1 个答案:

答案 0 :(得分:3)

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

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

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