Search code examples
openglglslshadergeometry-shader

How get few vertices on geometry shader in GLSL


I need get 4 vertices after vertex shader processing. Primitive(quad) drawing with target: GL_TRIANGLE_STRIP.

My code:

layout(lines_adjacency) in;
layout(triangle_strip, max_vertices = 4) out;

in vs_output
{
   vec4 color;
} gs_in[];

out gs_output
{
   vec2 st   ;
   vec4 color;
} gs_out;

void main()
{
   gl_Position  = gl_in[0].gl_Position;
   gs_out.st    = vec2(0.0f, 0.0f);
   gs_out.color = gs_in[0].color;
   EmitVertex();

   gl_Position  = gl_in[1].gl_Position;
   gs_out.st    = vec2(0.0f, 1.0f);
   gs_out.color = gs_in[1].color;
   EmitVertex();

   gl_Position  = gl_in[2].gl_Position;
   gs_out.st    = vec2(1.0f, 0.0f);
   gs_out.color = gs_in[2].color;
   EmitVertex();

   gl_Position  = gl_in[3].gl_Position;
   gs_out.st    = vec2(1.0f, 1.0f);
   gs_out.color = gs_in[3].color;
   EmitVertex();

   EndPrimitive();
}

compiller throw error: "array index out of bounds"

how i can get 4 vertex on geometry shader?


Solution

  • Primitive(quad) drawing with target: GL_TRIANGLE_STRIP.

    The primitive type must match your input primitive type. Just draw with GL_LINES_ADJACENCY, with every 4 vertices being an independent quad.

    Even better, stop murdering your performance with a geometry shader. You'd be better off just passing the texture coordinate as an input. Or, failing that, doing this in a vertex shader:

    out vec2 st;
    const vec2 texCoords[4] = vec2[4](
      vec2(0.0f, 0.0f),
      vec2(0.0f, 1.0f),
      vec2(1.0f, 0.0f),
      vec2(1.0f, 1.0f)
    );
    
    void main()
    {
      ...
    
      st = texCoords[gl_VertexID % 4];
    
      ...
    }
    

    Assuming that you rendered this with glDrawArrays rather than glDrawElements.