1

我有以下顶点着色器来旋转法线。在我实现之前,我还传递了网格的旋转矩阵来计算法线。那个时候灯光还不错。

#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);
}

但是使用这个着色器,在片段着色器中计算的光照会随着相机转动。我没有更改片段着色器,所以问题应该在上面的代码中。

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

4

1 回答 1

1

您用于创建普通矩阵的步骤可能不正常。

尝试:

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

编辑:

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

于 2013-01-25T20:17:25.927 回答