個々の位置と回転を持ついくつかのモデルがあるシーンがあります。法線が与えられると、シェーダーは各ピクセルに単純な双方向ライティングを適用します。
それが私の頂点シェーダーです。
#version 150
in vec3 position;
in vec3 normal;
in vec2 texcoord;
out vec3 f_normal;
out vec2 f_texcoord;
uniform mat4 model;
uniform mat4 view;
uniform mat4 proj;
void main()
{
mat4 mvp = proj * view * model;
f_normal = normal;
f_texcoord = texcoord;
gl_Position = mvp * vec4(position, 1.0);
}
そして、これがフラグメントシェーダーです。
#version 150
in vec3 f_normal;
in vec2 f_texcoord;
uniform sampler2D tex;
vec3 sun = vec3(0.5, 1.0, 1.5);
void main()
{
vec3 light = max(0.0, dot(normalize(f_normal), normalize(sun)));
gl_FragColor = texture(tex, f_texcoord) * vec4(light, 1.0);
}
回転のないオブジェクトの場合、これは正常に機能します。ただし、回転モデルの場合、照明も回転します。もちろん、そうではありません。
その理由は、法線が回転しないためです。すでに試しf_normal = model * normal;
ましたが、これは法線に回転と変換の両方を適用します。
では、ライティングのためにフラグメントシェーダーに送信する前に、頂点シェーダーで法線を回転させるにはどうすればよいですか?一般的なアプローチは何ですか?