【问题标题】:Light computation (shading) in model, tangent or camera space?模型、切线或相机空间中的光计算(着色)?
【发布时间】:2013-10-10 13:17:53
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢。为简单起见,我仍然对 TBN 矩阵进行正交归一化,因此我可以使用相同的公式,然后着色器独立于它获得的顶点数据(我可以简单地编写另一个着色器,它使用将所有内容转换为切线空间的“典型”方法) .
    猜你喜欢
    • 1970-01-01
    • 2012-05-12
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    • 2013-02-26
    相关资源
    最近更新 更多