为什么我的顶点法线在相机旋转时会旋转?

时间:2016-02-14 20:35:42

标签: c opengl glsl

我茶壶的顶点法线没有按预期变换。我怀疑正常矩阵没有在正确的坐标空间中转换。我想更多地了解这个问题以及如何解决它。

以下是用于演示问题的图像链接以及我用于绘制顶点法线的GLSL源代码。

茶壶:http://i.imgur.com/7gENzpO.png

茶壶近距离:http://imgur.com/aiWwVll.png

当我旋转相机时,带圆圈的顶点法线也会旋转:http://imgur.com/6laONRj.png

vertex.glsl:

attribute vec3 v_Position;        /* vertex position in model space */
attribute vec3 v_Normal;          /* vertex normal vector in model space */

uniform mat4 v_ModelViewMatrix;   /* model space to world space to eye space transform */
uniform mat4 v_ProjectionMatrix;  /* eye space to clip space transform */

out VS_OUT {
        vec3 normal;              /* vertex normal in eye space. */
} vs_out;

void main(void)
{
        vec4 WorldPosition = v_ModelViewMatrix * vec4(v_Position.xyz, 1.0);

        /* I know it's bad to compute this on the GPU but I wanted to be sure my matrix routines were not to blame. */
        mat3 NormalMatrix = transpose(inverse(mat3(v_ModelViewMatrix)));

        vs_out.normal = normalize(NormalMatrix * v_Normal);
        gl_Position = v_ProjectionMatrix * WorldPosition;
}

geometry.glsl

layout(triangles) in;
layout(line_strip, max_vertices = 2) out;

in VS_OUT {
        vec3 normal;
} gs_in[];

void main(void)
{
        gl_Position = gl_in[0].gl_Position;
        EmitVertex();

        gl_Position = gl_in[0].gl_Position + 0.1 * vec4(gs_in[0].normal, 0.0);
        EmitVertex();

        EndPrimitive();
}

提前致谢。

1 个答案:

答案 0 :(得分:2)

请注意,在几何着色器中,gl_in [0] .gl_Position位于剪辑空间中,而gs_in [0] .normal位于眼睛空间中。您可能希望在几何着色器中进行投影。