在几何着色器

时间:2016-01-14 17:59:39

标签: opengl geometry-shader

我正在尝试使用以下管道

计算几何着色器中的每面法线
//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个顶点,但我不太确定这是否是造成问题的原因。

Left: Using Light Weighting 'NL', Right:Without 左:使用轻量级'NL',右:没有

1 个答案:

答案 0 :(得分:2)

每次致电EmitVertex后,所有output variables are made undefined的内容。因此,如果要将相同的值输出到多个顶点,则必须每次都将其复制到输出中。

另请注意,每个着色器阶段的输出仅向 next 阶段提供 输入。因此,如果您有一个GS,并且想要将值从VS传递给FS,那么必须让GS显式传递该值。