我目前正在尝试实现需要有“切线空间”的凹凸贴图。我通读了一些教程,特别是以下两个:
- http://www.terathon.com/code/tangent.html
- http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-13-normal-mapping/
两个教程都避免在片段着色器中进行昂贵的矩阵计算,如果阴影计算照常发生在相机空间中(至少我已经习惯了),这将是必需的。
它们引入了切线空间,每个顶点可能不同(如果表面平滑,甚至每个片段)。如果我理解正确,为了有效的凹凸映射(即最小化片段着色器中的计算),他们使用顶点着色器将光计算所需的一切转换到这个切线空间。但我想知道模型空间是否是计算光照着色的好选择。
我关于这个话题的问题是:
对于切线空间中的着色计算,我在顶点着色器和片段着色器之间究竟传递了什么?我真的需要转换切线空间中的灯光位置,需要
O(number of lights)
不同的变量吗?例如,这不适用于延迟着色,或者如果由于顶点着色器中的某些其他原因不知道灯光位置。必须有一个(仍然有效的)替代方案,我猜这是模型空间中的着色计算。如果我通过模型空间变化,是否仍然在切线空间中执行着色计算是一个好主意,即在片段着色器中转换光位置?还是在模型空间中执行着色计算更好?哪个会更快?(在这两种情况下,我都需要一个 TBN 矩阵,但一种情况需要模型到切线的变换,另一种是切线到模型的变换。)
我目前将每个顶点法线、切线和双切线(正交法线)传递给顶点着色器。如果我理解正确,则仅当我想快速构建模型到切线空间矩阵时才需要正交化,该矩阵需要反转包含 TBN 向量的矩阵。如果它们是正交的,这只是一个转置。但是,如果我不需要切线空间中的向量,我不需要求逆,而只需要矩阵中的原始 TBN 向量,然后是模型的切线矩阵。这不会简化一切吗?