我茶壶的顶点法线没有按预期变换。我怀疑正常矩阵没有在正确的坐标空间中转换。我想更多地了解这个问题以及如何解决它。
以下是用于演示问题的图像链接以及我用于绘制顶点法线的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();
}
提前致谢。
答案 0 :(得分:2)
请注意,在几何着色器中,gl_in [0] .gl_Position位于剪辑空间中,而gs_in [0] .normal位于眼睛空间中。您可能希望在几何着色器中进行投影。