1

法線を回転させるための次の頂点シェーダーがあります。それを実装する前に、法線を計算するためにメッシュの回転行列も渡しました。その時の照明は大丈夫でした。

#version 150

uniform mat4 projection;
uniform mat4 modelview;

in vec3 position;
in vec3 normal;
in vec2 texcoord;

out vec3 fposition;
out vec3 fnormal;
out vec2 ftexcoord;

void main()
{
    mat4 mvp = projection * modelview;

    fposition   = vec3(mvp * vec4(position, 1.0));
    fnormal     = normalize(mat3(transpose(inverse(modelview))) * normal);
    ftexcoord   = texcoord;
    gl_Position = mvp * vec4(position, 1.0);
}

ただし、このシェーダーを使用すると、フラグメントシェーダーで計算された照明がカメラとともに回転します。フラグメントシェーダーを変更していないので、問題は上記のコードにあるはずです。

法線の計算で何が間違っていますか?

4

1 に答える 1

1

通常のマトリックスを作成するために使用する手順は、順序が正しくない可能性があります。

試す:

fnormal = normalize(transpose(inverse(mat3(modelview))) * normal)

編集:

mat4を反転しているので、変換値(mat4がmat3に変換されるときに切り捨てられます)は、おそらく逆行列の計算に影響を与えています。

于 2013-01-25T20:17:25.927 に答える