6

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 マトリックスを作成し、フラグメント シェーダーで法線マップからそれぞれの読み取り法線を変換することです。

4

1 に答える 1