我有一个场景,其中包含多个具有单独位置和旋转的模型。给定法线,着色器对每个像素应用简单的双向光照。
那是我的顶点着色器。
#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;
,但这会将旋转和变换都应用于法线。
那么在将法线发送到片段着色器进行照明之前,如何在顶点着色器中旋转法线?什么是常用方法?