这与另一个问题(图像中)描述的问题有关:
Opengl shader problems - weird light reflection artifacts
我有一个.obj导入程序,可以创建数据结构并计算切线和bitangents。这是我对象中第一个三角形的数据:
我对切线空间的理解是从顶点向外的法线点,切线与法线向量垂直(正交?)并且在纹理中指向正S的方向,并且切线垂直于两者。我不确定你叫什么,但我认为这3个矢量形成了看起来像旋转或变换的x,y,z轴。它们不是3 随机导向的向量,对吗?
我的理解:法线贴图中的法线提供了一个新的法线向量。但是在切线空间纹理贴图中,rgb编码法线和每个顶点法线之间没有内置方向。因此,您使用TBN矩阵来桥接间隙并将它们放在相同的空间中(或在正确的空间中获得照明)。
但后来我看到了对象数据......我的结构有270个顶点,所有这些顶点都有一个0为Tangent Y.这对于切线数据是否正确?这些切线是否像顶点正常空间一样?或者他们看起来完全错了?或者我对这是如何工作以及我的数据是对的感到困惑?
为了更接近在另一个问题中解决我的问题,我需要确保我的数据是正确的,以及我对切线空间照明数学如何工作的理解。
答案 0 :(得分:4)
切线和切线向量指向纹理坐标的S和T分量的方向(对于不习惯OpenGL术语的人,U和V)。所以切线向量指向S和沿着T的切入点。
所以是的,这些 与正常的或彼此正交。它们遵循纹理映射的方向。实际上,这就是他们的目的:允许您将法线从模型空间转换为纹理空间。它们定义了从模型空间到纹理空间的映射。
如果该顶点处的S和T分量是正交的,则切线和双切线将仅彼此正交。也就是说,如果纹理映射没有剪切。虽然大多数纹理映射算法都会尽量减少剪切,但它们无法消除它。因此,如果您需要精确的矩阵,则需要非正交切线和比特。