在着色器问题中计算法线

时间:2013-01-25 16:08:07

标签: matrix glsl shader projection lighting

我有以下顶点着色器到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);
}

但是使用此着色器,片段着色器中计算的光照随相机一起变化。我没有更改片段着色器,所以问题应该在上面的代码中。

我在计算法线时做错了什么?

1 个答案:

答案 0 :(得分:1)

用于创建普通Matrix的步骤可能不正常。

尝试:

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

修改

由于您正在反转mat4,因此平移值(当mat4转换为mat3时会被截断)可能会影响逆矩阵的计算。