2017-11-07 5 views
0

私のアプリケーション(画像ソナーシミュレーション)にGLSLを使った通常のマッピングを使用しましたが、シェーダでTBN行列を計算することで問題が発生しました。法線ベクトルは、画像の中心と比較して、境界上に低い解像度を含む。 enter image description hereGLSLで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; 
} 

パート:

は、私の頂点コードに従います通常のマッピングは適切ですか?事前に

おかげで、

+0

'cross(t、n)== cross(n、t)'は '' cross(t、n)+ cross(n、t) 'は0.0になる。 – Rabbid76

+0

@ Rabbid76、どうすればTBNを正しく計算できますか?私は接線部分が正しいかどうか分からない。 –

+0

右手系か左利き系かによって異なります([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

答えて

0

は、私は右利きシステムまたはaleft利きシステムのいずれかを使用して、しかし、私は良い結果を達することができなかった、Rabbid76のヒント@続きます。以下の詳細を参照してください。

コード(aleft利きシステム):

#version 130 

in vec3 tangent; 
in vec3 bitangent; 
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 b = vec3(1,0,0); 
    vec3 t = normalize(cross(b, n)); 
    b = cross(t, n); 
    TBN = transpose(mat3(t,b,n)); 

    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; 
    gl_TexCoord[0] = gl_MultiTexCoord0; 
} 

結果(aleft利きシステム): enter image description here

コード(aleft利きシステム):

#version 130 

in vec3 tangent; 
in vec3 bitangent; 
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 b = vec3(1,0,0); 
    vec3 t = normalize(cross(b, n)); 
    b = cross(n, t); 
    TBN = transpose(mat3(t,b,n)); 

    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; 
    gl_TexCoord[0] = gl_MultiTexCoord0; 
} 

結果(右利きシステム): enter image description here

+0

@ Rabbid76、この問題を解決するためのヒントはありますか? –

関連する問題