2
votes

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

1
The geometry shader is executed once for each primitive. How many primitives do you draw? 2?Rabbid76
Honestly, I'm not sure. I'm using the shader on a Processing rectangle. Here's the full code: github.com/PauRosello97/Formorgel-Shaders. Thank you.Pau Rosello
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

1 Answers

2
votes

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;