0

モデルの法線を使用すると、結果は良好です (単純なランバート拡散シェーダから期待されるように、暗い領域と明るい領域があります)

しかし、法線マップを使用すると、暗い領域が明るくなります!

法線マップを使用しながら、これらの例のように正しい拡散照明を取得したい

これは、通常のマッピングを使用する場合と使用しない場合のコードです

これが法線マップを使用するコードです

頂点シェーダー

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

法線マップは拡散反射光で機能するようになりましたが、拡散反射光だけでは正しくありません

4

1 に答える 1

0

回答については、以下を参照してください。

クイック(おそらく間違った)観察:ライン

vec3 normalVector = normalize( 2 * texture2D(textures[0],gl_TexCoord[0].st).rgb - 1 );

フラグメントシェーダーでは、法線を正しく再スケーリングして、負の値を許可します。法線マップが正しくない場合、負の値が望ましくない場所に発生する可能性があります (Y 軸と推測されます)。法線に負の値を指定すると、ライティングが反転する可能性があります。

あなたへの私の質問: あなたの法線マップは正しいですか?

ANSWER : 少し議論した後、問題が見つかりました。スレッドをクリーンに保つためにこの投稿を編集しました。Darko の問題の解決策は、ここのコメントにあります。それは、lightDir と呼ばれる初期化されていない変化に行き着きました。

元のコメント:

lightDir = 正規化 (v); lightDir = normalize(vec3(1.0,0.5,1.0) - vertexPosition); これはおかしい、すぐに上書きする、これは間違っていますか?あなたは正しく翻訳されたlightDirを保持していないようです...または私は狂っています...また、このlightDirはさまざまですが、まったく設定していません。では、ゼロから av ベクトルを計算しますか?

于 2013-05-14T14:11:14.340 に答える