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

标签 opengl matrix glsl

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

最佳答案

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

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

现在,事情是,你的光和你的眼睛可能不是在切线空间中定义的,而是在世界空间中定义的。例如半角向量等也是如此
只有当事物都在同一坐标系中时,您才能以有意义的方式进行计算。 TBN 允许您从一种转换为另一种。

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

当您需要获取多个纹素(例如采样高度图,而不是法线图)时,会出现类似的情况。当然,您有一个插值 UV 坐标。因此明确了要采样的纹素。
但现在您还想对 4x4 四边形中的其他 3 个纹素进行采样。或者也许您想做光线行进。您将在哪个方向采样下一个纹素?您不知道,因为您可以以任何您喜欢的方式围绕法线旋转 UV 坐标系。每次轮换都同样有效或无效。
TBN 解决了​​这个问题,因为 N 指向上方(“远离纹理图像”),并且 T 和 B 与 U 和 V 指向相同的方向。

关于opengl - 为什么在 OpenGL 中需要 TBN 矩阵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17080951/

相关文章:

opengl - opengl 3.3 后处理效果的高效下采样

python - levenshtein矩阵单元格计算

c - 使用 C 中的 realloc() 函数增加二维数组中的列

python - 将包含矩阵对角线以下元素的列表转换为完整矩阵

matrix - glsl 向量*矩阵与 hlsl 不同

arrays - unsafe.Pointer to []byte in Go

c# - vb.net 重载解析失败,出现 "multiple members with this name exist in class"

macos - OSX 上的 openGL glGenList 段错误

Opengl - 使特定的 VBO 不在 GL_SCISSORS_TEST 的特定屏幕区域 ("inverse"中绘制)

浮点 gpgpu 的 opengl 纹理格式