#version 460 layout(triangles, invocations=2) in; in vec4 fca[]; layout(triangle_strip, max_vertices=9) out; out vec4 fcolor; uniform mat4 mvp; float getavg(int idx){ return (gl_in[0].gl_Position[idx] + gl_in[1].gl_Position[idx] + gl_in[2].gl_Position[idx]) / 3; } void make_triangle(vec4 v1, vec4 c1, vec4 v2, vec4 c2, vec4 v3, vec4 c3){ gl_Position = mvp * v1; fcolor = c1; EmitVertex(); gl_Position = mvp * v2; fcolor = c2; EmitVertex(); gl_Position = mvp * v3; fcolor = c3; EmitVertex(); EndPrimitive(); } void main(void) { if(gl_InvocationID == 1){ make_triangle( gl_in[0].gl_Position, vec4(0, .6, .6, 1), gl_in[1].gl_Position, vec4(0, .6, .6, 1), gl_in[2].gl_Position, vec4(0, .6, .6, 1)); } else { vec3 av = gl_in[2].gl_Position.xyz - gl_in[0].gl_Position.xyz; vec3 bv = gl_in[1].gl_Position.xyz - gl_in[0].gl_Position.xyz; vec4 normal = vec4(normalize(cross(av,bv)), 0); vec4 center = vec4(getavg(0), getavg(1), getavg(2), 1); vec4 top = center + normal; make_triangle( gl_in[0].gl_Position, fca[0], gl_in[1].gl_Position, fca[1], top, vec4(1, 1, 1, 1)); make_triangle( gl_in[1].gl_Position, fca[1], gl_in[2].gl_Position, fca[2], top, vec4(1, 1, 1, 1)); make_triangle( gl_in[2].gl_Position, fca[2], gl_in[0].gl_Position, fca[0], top, vec4(1, 1, 1, 1)); } }