我只是想知道我的理解TBN矩阵计算正确法线贴图,TBN矩阵计算
在顶点着色器,我们通常使用:
vec3 n = normalize(gl_NormalMatrix * gl_Normal);
vec3 t = normalize(gl_NormalMatrix * Tangent.xyz);
vec3 b = normalize(gl_NormalMatrix * Bitangent.xyz);
mat3 tbn = mat3(t, b, n);
据我了解这个tbn
矩阵从变换的矢量Tangent space to Eye space。实际上,我们想要反转 - 从眼睛空间向Tangent空间转换矢量。因此,我们需要反转tbn
矩阵:
tbn = transpose(tbn); // transpose should be OK here for doing matrix inversion
注:tbn
- 应该只包含旋转,对于这种情况下,我们可以使用转逆矩阵。
我们可以改变我们的载体:
vec3 lightT = tbn * light_vector;
... = tbn * ...
在几个教程,源代码中我发现,作者用这样的:
light.x = dot(light, t);
light.y = dot(light, b);
light.z = dot(light, n);
上面的代码不一样乘以由transposed(tbn)
矩阵组成。
问题:
我们应该用换位tbn
矩阵正如我上面所解释的?或者我错过了什么?
注解通过该解决方案,我们将矢量(light_vector)转换为顶点着色器中的TBN,然后在片段着色器中我们只需从法线贴图中获得法线。其他选项是创建从TBN空间转换到眼图空间的TBN矩阵,然后在片段着色器中从法线贴图转换每个读取法线。
定义“正确的“?你把你的正常和切向量的交叉乘积拿到你的苦味矢量。一般来说,这对于大多数表面来说*不是正确的。对你来说这可能是正确的,但大多数纹理映射不使用完美的正交映射到曲面。 – 2013-03-10 21:54:08
对,我已经更新了这个问题。我也改变了不安的计算方式。 – fen 2013-03-11 08:01:47