モデルの法線を使用すると、結果は良好です (単純なランバート拡散シェーダから期待されるように、暗い領域と明るい領域があります)
しかし、法線マップを使用すると、暗い領域が明るくなります!
法線マップを使用しながら、これらの例のように正しい拡散照明を取得したい
これは、通常のマッピングを使用する場合と使用しない場合のコードです
これが法線マップを使用するコードです
頂点シェーダー
varying vec3 normal,lightDir;
attribute vec3 vertex,normalVec,tangent;
attribute vec2 UV;
void main(){
gl_TexCoord[0] = gl_TextureMatrix[0] * vec4(UV,0.0,0.0);
normal = normalize (gl_NormalMatrix * normalVec);
vec3 t = normalize (gl_NormalMatrix * tangent);
vec3 b = cross (normal, t);
vec3 vertexPosition = normalize(vec3(gl_ModelViewMatrix * vec4(vertex,1.0)));
vec3 v;
v.x = dot (lightDir, t);
v.y = dot (lightDir, b);
v.z = dot (lightDir, normal);
lightDir = normalize (v);
lightDir = normalize(vec3(1.0,0.5,1.0) - vertexPosition);
gl_Position = gl_ModelViewProjectionMatrix*vec4(vertex,1.0);
}
フラグメント シェーダー
vec4 computeDiffuseLight (const in vec3 direction, const in vec4 lightcolor, const in vec3 normal, const in vec4 mydiffuse){
float nDotL = dot(normal, direction);
vec4 lambert = mydiffuse * lightcolor * max (nDotL, 0.0);
return lambert;
}
varying vec3 normal,lightDir;
uniform sampler2D textures[8];
void main(){
vec3 normalVector = normalize( 2 * texture2D(textures[0],gl_TexCoord[0].st).rgb - 1 );
vec4 diffuse = computeDiffuseLight (lightDir, vec4(1,1,1,1) , normalVector, vec4(0.7,0.7,0.7,0));
gl_FragColor = diffuse ;
}
注: 実際の法線マッピングは、スペキュラー ハイライトに見られるように正しく機能します。
Assimp を使用してモデル (md5mesh) をロードし、Assimp を使用してタンジェントも計算し、それを属性としてシェーダーに送信しました
ここに問題のコードとスクリーンショットへのリンクがあります
https://dl.dropboxusercontent.com/u/32670019/code%20and%20screenshots.zip
それはコードの問題ですか、それとも私の誤解ですか?
更新されたコードとスクリーンショット
https://dl.dropboxusercontent.com/u/32670019/updated%20code%20and%20screenshots.zip
法線マップは拡散反射光で機能するようになりましたが、拡散反射光だけでは正しくありません