OpenGL究竟是在什么时候执行透视除法的?


在学习几何着色器时看其Shader代码, 产生了一个小问题.

#version 330 core
layout (triangles) in;
layout (line_strip, max_vertices = 6) out;

in VS_OUT {
    vec3 normal;
} gs_in[];

const float MAGNITUDE = 0.2;

void GenerateLine(int index)
{
    gl_Position = gl_in[index].gl_Position;
    EmitVertex();
    gl_Position = gl_in[index].gl_Position + vec4(gs_in[index].normal, 0.0) * MAGNITUDE;
    EmitVertex();
    EndPrimitive();
}

void main()
{
    GenerateLine(0); // first vertex normal
    GenerateLine(1); // second vertex normal
    GenerateLine(2); // third vertex normal
}

此处的gl_in[index].gl_Position是在前面的顶点着色器中经过MVP矩阵的(即处于裁剪空间下), 而gs_in[index].normal则也是经过了投影矩阵和法线矩阵的处理(亦处于裁剪空间之下). 而我们知道, 在顶点着色器之后OpenGL会自动执行透视除法, 但究竟是否是立即执行, 许多国内博客基本都没提到. 如果在运行几何着色器时已经执行了透视除法, 那么此时将顶点位置和法向量直接相加是不合理的, 因为前者已经除过了$w$分量且经过了视口变换.

经过和师兄的讨论, 且在Google上搜得相关问题, 终于解决了这个小小的问题.

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注