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
行列はベクトルをタンジェント空間からアイ空間に変換します。実際には逆が必要です - ベクトルを目空間から接線空間に変換します。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 マトリックスを作成し、フラグメント シェーダーで法線マップからそれぞれの読み取り法線を変換することです。