这与另一个问题中描述的问题有关(有图像):
Opengl shader problems - weird light reflection artifacts
我有一个.obj导入器,它可以创建一个数据结构并计算切线和双切线。下面是对象中第一个三角形的数据:
的数据
我对切线空间的理解是法线从顶点向外指向,切线是垂直的(正交?)的法线向量,并指向纹理中的正S方向,而双切线垂直于两者。我不知道你怎么称呼它,但我认为这3个向量形成了看起来像旋转或变换的x,y,z轴,它们不会是3个随机定向的向量,对吧?
我的理解:法线贴图中的法线提供了一个新的法线向量。但是在切线空间纹理贴图中,rgb编码的法线和逐顶点法线之间没有内置的方向。因此,您可以使用TBN矩阵来桥接差距,并将它们放在同一个空间中(或在正确的空间中获得照明)。
但后来我看到了对象数据.我的结构有270个顶点,它们的切线Y都是0。这对切线数据正确吗?这些切线是在顶点法线空间还是什么?还是它们看起来完全错误?还是我对它的工作原理感到困惑,我的数据是正确的?
为了更接近解决我在另一个问题中的问题,我需要确保我的数据是正确的,以及我对切线空间照明数学如何工作的理解。
1条答案
按热度按时间ukxgm1gy1#
切线向量和双切向量指向纹理坐标的S和T分量的方向(对于不熟悉OpenGL术语的人来说是U和V),因此切线向量沿着S,双切向量沿着T。
所以,这些法线并不一定要与法线正交,也不一定要相互正交。它们遵循纹理Map的方向。事实上,这就是它们的目的:允许您将法线从模型空间转换到纹理空间。它们定义了从模型空间到纹理空间的Map。
切线和双切线只有在该顶点的S和T分量正交时才相互正交。也就是说,如果纹理Map没有剪切。虽然大多数纹理Map算法会尝试最小化剪切,但它们可能不会在所有情况下都消除剪切。在这些情况下,精确的矩阵将包括剪切位置处的非正交切线和双切线。