1

I'm trying to generate a simple shape with a Geometry Shader, but the shape is rendering twice and I don't know why.

First we have a really simple Vertex Shader

#version 150

in vec4 position;
 
void main() {
  gl_Position = position;
}

Then there's a Geometry Shader thats generating a simple triangle.

#version 150

layout (triangles) in;
layout (triangle_strip, max_vertices = 5) out;
 
out FragData {
  vec4 color;
} FragOut;
 
void main(){

  //RED TOP LEFT
  FragOut.color = vec4(1.0, 0.0, 0.0, 1.0); 
  gl_Position = gl_in[0].gl_Position + vec4( -1.0, 0.0, 0.0, 0.0);
  EmitVertex();

  //BLUE BOTTOM LEFT
  FragOut.color = vec4(0., 0., 1., 1.);
  gl_Position = gl_in[0].gl_Position + vec4( -1.0, -1.0, 0.0, 0.0);
  EmitVertex();

  //GREEN BOTTOM RIGHT
  FragOut.color = vec4(0.0, 1.0, 0.0, 1.0);
  gl_Position = gl_in[0].gl_Position + vec4( 1.0, -1.0, 0.0, 0.0);
  EmitVertex();

  EndPrimitive();
}

And finally a simple Fragment Shader

#version 150

in FragData {
  vec4 color;
} FragIn;

out vec4 fragColor;

void main() {
  fragColor = FragIn.color;
}

The result should be a triangle, but TWO triangles are being rendered:

Here's the result

Pau Rosello
  • 137
  • 7
  • 1
    The geometry shader is executed once for each primitive. How many primitives do you draw? 2? – Rabbid76 Jan 12 '21 at 18:21
  • Honestly, I'm not sure. I'm using the shader on a Processing rectangle. Here's the full code: https://github.com/PauRosello97/Formorgel-Shaders. Thank you. – Pau Rosello Jan 12 '21 at 22:11
  • `rect(0, 0, width, height);` does this draw a rectangle? If so, you are drawing two triangles. And you calculate all coordinates using the first vertex position. So everything is working fine. – Cem Jan 12 '21 at 22:16

1 Answers1

2

The Geometry Shader is executed once for each primitive. A rect() consists of 2 triangles, so the geometry shader is executed twice and generates 2 triangle_strip primitives.

Draw a single POINTS primitive instead of the rectangle:

beginShape(POINTS);
vertex(x, y);
endShape();

Note that you need to change the Primitive input specification:

layout (triangles) in;

layout (points) in;
Rabbid76
  • 202,892
  • 27
  • 131
  • 174
  • Thank you for your answer. I'm sure this is the way, but I get an error when I change the Primitive input specification: OpenGL error 1282 at bot endDraw(): invalid operation – Pau Rosello Jan 12 '21 at 22:51