我最近正在学习与TBN Matrix相关的东西。我已经知道如何计算TBN矩阵以及我们将以何种方式使用它将法线从切线空间转换为对象/世界空间(取决于TBN的基础向量),以便它们能够被计算出来在同一空间的灯光。
但是我也注意到,几乎在教授这个主题的每个教程中,总会有一个部分告诉我们如何计算TBN的反转,以便您可以将光转换为切线空间作为选项。
实际上,这只是一个选项,但我们有这样的理由吗?将法线从切线空间转换为对象/世界空间并将光从对象/世界空间转换为切线空间之间有什么区别吗?我们可以获得一些性能还是可以节省大量内存或计算成本?我只是想不出来,因为我认为它们具有相同数量的计算,因为每个顶点都有自己独特的TBN矩阵。
感谢您的帮助〜
答案 0 :(得分:2)
由于各种原因,法线贴图通常存储在切线空间中(精度更高,可以在多个对象之间共享贴图,可以对对象进行动画处理等)。如果要在世界空间中进行照明,则必须使用TBN矩阵将正常的每像素转换为世界空间。一种常见的优化方法是将光线转换为每个顶点的切线空间,并将其插入三角形。这节省了每像素相对昂贵的矩阵变换,而只是每个顶点进行变换。
这种优化在较旧的硬件上更受欢迎,其中必须非常严格地管理像素着色器性能和复杂性。当你在渲染过程中只有一盏灯时,它也是最有意义的,因为你必须将每盏灯转换成世界空间,然后快速吃掉任何积蓄并燃烧内插器。现在你更有可能看到延迟渲染器将所有法线转换为世界空间并将它们写入G-Buffer,或者前向/前向加渲染器,它们在一次通过中应用多个灯光,因此通常会更多有效地在世界空间进行照明计算。