BackSpace7777777
BackSpace7777777

Reputation: 161

OpenGL Geometry Shader rendering triangle instead of square from a point

I am trying to render a square from a single point, here is my geometry shader code:

#version 330 core
layout (points) in;
layout(triangle_strip, max_vertices=4) out;

void main(){
    vec4 pos=gl_in[0].gl_Position;
    gl_Position=pos+vec4(1,1,0,0);
    EmitVertex();
    gl_Position=pos+vec4(1,-1,0,0);
    EmitVertex();
    gl_Position=pos+vec4(-1,-1,0,0);
    EmitVertex();
    gl_Position=pos+vec4(-1,1,0,0);
    EmitVertex();
    EndPrimitive();
}

Vertex shader looks like this:

#version 330 core
layout (location=0) in vec3 position;

uniform mat4 view;
uniform mat4 projection;
uniform mat4 model;

void main(){
    gl_Position=projection*view*model*vec4(position,1.0);
}

It only renders a triangle, I'm not sure why it only renders a triangle.

Upvotes: 1

Views: 84

Answers (1)

Rabbid76
Rabbid76

Reputation: 210909

The vertices define a triangle strip. Every group of 3 adjacent vertices forms a triangle and the winding order is defined by the winding of the first triangle (successive triangles have reversed order). When face culling is enabled, you need to care about the winding order. The default winding order of front faces is counter clockwise. Therefore you have to swap the 1st and 2nd vertex:

void main(){
    vec4 pos=gl_in[0].gl_Position;
    gl_Position=pos+vec4( 1, -1, 0, 0);
    EmitVertex();
    gl_Position=pos+vec4( 1,  1, 0, 0);
    EmitVertex();
    gl_Position=pos+vec4(-1, -1, 0, 0);
    EmitVertex();
    gl_Position=pos+vec4(-1,  1, 0, 0);
    EmitVertex();
    EndPrimitive();
}

Upvotes: 1

Related Questions