我有以下顶点着色器到rotate normals。在我实现之前,我还传递了网格的旋转矩阵来计算法线。那个时候照明很好。
#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);
}
但是使用此着色器,片段着色器中计算的光照随相机一起变化。我没有更改片段着色器,所以问题应该在上面的代码中。
我在计算法线时做错了什么?
答案 0 :(得分:1)
用于创建普通Matrix的步骤可能不正常。
尝试:
fnormal = normalize(transpose(inverse(mat3(modelview))) * normal)
修改强>
由于您正在反转mat4,因此平移值(当mat4转换为mat3时会被截断)可能会影响逆矩阵的计算。