为什么我在OpenGL中需要TBN矩阵?

时间:2013-06-13 06:54:31

标签: opengl matrix glsl

我认为我无法理解TBN概念,他们将它用于凹凸贴图,法线贴图等。但它们不能仅使用模型视图矩阵从纹素中提取法线吗?我需要TBN矩阵的解释,我真的无法理解使用原因。

1 个答案:

答案 0 :(得分:3)

您使用的每个点和矢量都在某个参考系中定义,但它可以从一个转换为另一个。

从纹理贴图中读取的法线位于“切线空间”中。这实际上不是强制性的,例如你也可以在世界空间中定义它们。但想想看,如果旋转模型,法线会发生什么?切线空间随模型一起旋转,这意味着法线也是如此(即使您对网格进行变形/蒙皮)。否则,您需要为每次可能的旋转提供不同的法线 这就是为什么使用切线空间是事实上的必要条件(无论如何,它都是选择)。

现在,问题是,你的光和你的眼睛可能没有在切线空间中定义,而是在世界空间中定义。例如,半角矢量等也是如此 如果它们都在相同的坐标系中,您只能以有意义的方式计算。 TBN允许您从一个转换为另一个。

单独的顶点法线是不够的(但是法线和T或B都是,另一个可以使用叉积来计算),因为你只能用单个向量定义方向 ,但不是“螺丝”。因此,如果没有至少一个向量,则不会定义法线,它们可以以各种可能的方式围绕顶点法线旋转,每个方向同样有效或无效。

当您需要获取多个纹素时(例如采样高度贴图,而不是法线贴图),会出现类似的情况。当然,你有一个插值的UV坐标。所以要明确定义哪个纹素要素 但是现在你想要在4x4四核中采样其他3个纹素。或许你想要做射线游戏。您将在哪个方向采样下一个纹素?您不知道,因为您可以按照自己喜欢的方式围绕法线旋转UV坐标系。每次轮换同样有效或无效 TBN解决了这个问题,因为N点向上(“远离纹理图像”),T和B指向与U和V相同的方向。