在学习几何着色器时看其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上搜得相关问题, 终于解决了这个小小的问题. ![]()
