私のアプリケーション(画像ソナーシミュレーション)にGLSLを使った通常のマッピングを使用しましたが、シェーダでTBN行列を計算することで問題が発生しました。法線ベクトルは、画像の中心と比較して、境界上に低い解像度を含む。 GLSLでTBN行列を正しく計算する方法
私が計算するTBN行列を計算することができます方法:これは、得られた数値である
#version 130
in vec3 pos;
in vec3 normal;
in mat3 TBN;
uniform sampler2D normalTexture;
void main() {
vec3 newNormal = (texture2D(normalTexture, gl_TexCoord[0].st).rgb * 2.0 - 1) * TBN;
newNormal = normalize(newNormal);
...
}
:私のフラグメント・コードの
#version 130
out vec3 pos;
out vec3 normal;
out mat3 TBN;
void main() {
pos = (gl_ModelViewMatrix * gl_Vertex).xyz;
normal = gl_NormalMatrix * gl_Normal.xyz;
vec3 n = normalize(normal);
vec3 t = normalize(cross(normal, vec3(-1,0,0)));
vec3 b = cross(t, n) + cross(n, t);
TBN = transpose(mat3(t,b,n));
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
gl_TexCoord[0] = gl_MultiTexCoord0;
}
パート:
は、私の頂点コードに従います通常のマッピングは適切ですか?事前に
おかげで、
'cross(t、n)== cross(n、t)'は '' cross(t、n)+ cross(n、t) 'は0.0になる。 – Rabbid76
@ Rabbid76、どうすればTBNを正しく計算できますか?私は接線部分が正しいかどうか分からない。 –
右手系か左利き系かによって異なります([Binormal Vectorの計算](https://stackoverflow.com/questions/47117083/calculating-binormal-vector/47121567#47121567)を参照)。右手系では、「vec3 b = vec3(1,0,0); vec3 t = normalize(cross(b、n))」「b = cross(n、t);」 – Rabbid76