Hamaro
Hamaro

Reputation: 49

Can't get openGL's glDrawElements to work with geometry shader

i have attached the shader but i can't find any info on how to use glDrawElements with a goemetry shader attached to the shader program. The program would output a quad on the screen without the geometry shader, now i'm trying to do the same but with a geometry shader attached.

//In my .cpp file
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);


// Vertex shader
#version 440
layout(location = 0) in vec3 vertex_position;
layout(location = 1) in vec3 vertex_color;

uniform mat4 world_matrix;
uniform mat4 view_matrix;
uniform mat4 projection_matrix;

out vec3 color;

void main() {
    color = vertex_color;

    gl_Position = projection_matrix*view_matrix* world_matrix * 
    vec4(vertex_position, 1.0);

}

// Geometry shader
#version 440 core
layout (triangle_strip) in;
layout (triangle_strip, max_vertices = 6) out;
layout(location = 1) in vec3 vertex_color;

out vec3 color;

 void main()
{
  for(int i = 0; i < gl_in.length(); i++)
  {
     // copy attributes
    gl_Position = gl_in[i].gl_Position;

    color=vertex_color;
    // done with the vertex
    EmitVertex();
  }
  EndPrimitive();

}

//Fragment shader
#version 440
in vec3 color;
out vec4 fragment_color;

void main () {
    fragment_color = vec4 (color, 1.0);
}

Upvotes: 1

Views: 810

Answers (1)

Rabbid76
Rabbid76

Reputation: 211278

See the handy OpenGL wiki site of Khronos Group for Shader stage inputs and outputs:

Global variables declared with the in qualifier are shader stage input variables. These variables are given values by the previous stage (possibly via interpolation of values output from multiple shader executions).

Global variables declared with the out qualifier are shader stage output variables. These values are passed to the next stage of the pipeline (possibly via interpolation of values output from multiple shader executions).

Geometry Shader inputs are aggregated into arrays, one per vertex in the primitive. The length of the array depends on the input primitive type used by the GS. Each array index represents a single vertex in the input primitive.

You have a vertex shader, a geometry shader and a fragment shader. In this case the vertex shader is the first shader stage, followed by the geometry shader and the last shader stage is the fragment shader.
So the input variables of the geometry shader have to match to the output variables of the vertex shader. The input variables of the fragment shader have to match to the output variables of the geometry shader.

Further note, that the possible input primitive specifier are points, lines, lines_adjacency, triangles and triangles_adjacency.
See also Geometry Shader - Primitive in/out specification.


This means you code has to look somehow like this:

Vertex shader:

#version 440
layout(location = 0) in vec3 vertex_position;
layout(location = 1) in vec3 vertex_color;

uniform mat4 world_matrix;
uniform mat4 view_matrix;
uniform mat4 projection_matrix;

out vec3 vert_stage_color;

void main()
{
    vert_out_color = vertex_color;

    gl_Position = projection_matrix*view_matrix* world_matrix * vec4(vertex_position, 1.0);
}

Geometry shader:

#version 440 core
layout (triangles) in;
layout (triangle_strip, max_vertices = 6) out;
layout(location = 1) in vec3 vertex_color;

in  vec3 vert_stage_color[];
out vec3 geo_stage_color;

void main()
{
    for(int i = 0; i < gl_in.length(); i++)
    {
        // copy attributes
        gl_Position = gl_in[i].gl_Position;

        geo_stage_color = vert_stage_color[i];
        // done with the vertex
        EmitVertex();
    }
    EndPrimitive();
}

Fragment shader:

#version 440
in vec3 geo_stage_color;
out vec4 fragment_color;

void main ()
{
    fragment_color = vec4(geo_stage_color, 1.0);
}

Upvotes: 1

Related Questions