我正在尝试使用以下管道
计算几何着色器中的每面法线//VERTEX_SHADER
#version 330
layout(location = 0) in vec4 vertex;
out vec3 vert;
uniform mat4 projMatrix;
uniform mat4 mvMatrix;
void main()
{
vert = vertex.xyz;
gl_Position = projMatrix * mvMatrix * vertex;
}
//GEOMETRY_SHADER
#version 330
layout ( triangles ) in;
layout ( triangle_strip, max_vertices = 3 ) out;
out vec3 normal_out;
uniform mat3 normalMatrix;
void main()
{
vec3 A = gl_in[2].gl_Position.xyz - gl_in[0].gl_Position.xyz;
vec3 B = gl_in[1].gl_Position.xyz - gl_in[0].gl_Position.xyz;
normal_out = normalMatrix * normalize(cross(A,B));
gl_Position = gl_in[0].gl_Position;
EmitVertex();
gl_Position = gl_in[1].gl_Position;
EmitVertex();
gl_Position = gl_in[2].gl_Position;
EmitVertex();
EndPrimitive();
}
//FRAG_SHADER
#version 330
in vec3 normal_out;
in vec3 vert;
out vec4 fColor;
uniform vec3 lightPos;
void main()
{
highp vec3 L = normalize(lightPos - vert);
highp float NL = max(dot(normal_out, L), 0.0);
highp vec3 color = vec3(1, 1, 0.0);
fColor = vec4(color*NL, 1.0);
}
然而,我最终看到非常奇怪的面孔,一直闪烁(我在下面包含了一个快照)。我想到它可能是因为我使用8个顶点来表示1个单元格(立方体)而不是24个顶点,但我不太确定这是否是造成问题的原因。
答案 0 :(得分:2)
每次致电EmitVertex
后,所有output variables are made undefined的内容。因此,如果要将相同的值输出到多个顶点,则必须每次都将其复制到输出中。
另请注意,每个着色器阶段的输出仅向 next 阶段提供 输入。因此,如果您有一个GS,并且想要将值从VS传递给FS,那么必须让GS显式传递该值。