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