这与另一个问题(图中的图像)中描述的问题有关:
Opengl shader problems - weird light reflection artifacts
我有一个.obj导入器,它创建一个数据结构并计算切线和切线。这是我对象中第一个三角形的数据:
我对切线空间的理解是法线从顶点向外指向,切线垂直于法线矢量(正交吗?)并指向纹理中正S的方向,而双切线垂直于两者。我不确定您怎么称呼它,但我认为这3个向量形成了看起来像旋转或变换后的x,y,z轴。它们不会是3个随机定向的向量,对吗?
我的理解也是:法线图中的法线提供了新的法线向量。但是在切线空间纹理贴图中,rgb编码法线和每个顶点法线之间没有内置的方向。因此,您可以使用TBN矩阵来弥合间隙并将它们放在相同的空间中(或在正确的空间中获得照明)。
但是后来我看到了对象数据...我的结构有270个顶点,并且所有切线Y的顶点均为0。这对切线数据正确吗?这些切线是在顶点法线空间中还是其他东西?还是它们看起来完全不对?还是我对它的工作原理和数据正确感到困惑?
为了进一步解决另一个问题中的问题,我需要确保我的数据正确并且对切线空间照明数学的工作方式有所了解。
最佳答案
切线和双切线向量指向纹理坐标的S和T分量的方向(对于不习惯OpenGL术语的人为U和V)。因此,切向量沿S指向,切线沿T指向。
因此,是的,它们不必正交于法线或彼此正交。它们遵循纹理映射的方向。确实,这就是他们的目的:允许您将法线从模型空间转换为纹理空间。他们定义了从模型空间到纹理空间的映射。
仅当该顶点的S和T分量正交时,切线和双切线才彼此正交。也就是说,如果纹理映射没有晃动。尽管大多数纹理贴图算法会尽量减少晃动,但无法消除。因此,如果需要精确的矩阵,则需要非正交切线和双切线。