#version 460 layout(triangles, invocations=1) 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){ // Apply MVP v1 = mvp * v1; v2 = mvp * v2; v3 = mvp * v3; vec3 av = v1.xyz - v3.xyz; vec3 bv = v2.xyz - v3.xyz; vec3 normal = normalize(cross(av,bv)); vec3 light_direction = vec3(1, 0, 1); float light_factor = dot(light_direction, normal.xyz) * .8; if(light_factor < 0.3) light_factor = 0.3; gl_Position = v1; fcolor = c1 * light_factor; EmitVertex(); gl_Position = v2; fcolor = c2 * light_factor; EmitVertex(); gl_Position = v3; fcolor = c3 * light_factor; 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); normal *= -.999; vec3 light_direction = vec3(1, 0, 0); float light_factor = dot(light_direction, normal.xyz); if(light_factor < 0.1) light_factor = 0.1; vec4 center = vec4(getavg(0), getavg(1), getavg(2), 1); float d_01 = distance(gl_in[0].gl_Position, gl_in[1].gl_Position); float d_12 = distance(gl_in[1].gl_Position, gl_in[2].gl_Position); float d_20 = distance(gl_in[2].gl_Position, gl_in[0].gl_Position); bool t01 = true; bool t12 = true; bool t20 = true; if(d_01 > d_12 && d_01 > d_20){ center = (gl_in[0].gl_Position + gl_in[1].gl_Position) / 2; t01 = false; } else if(d_12 > d_20){ center = (gl_in[1].gl_Position + gl_in[2].gl_Position) / 2; t12 = false; } else { center = (gl_in[2].gl_Position + gl_in[0].gl_Position) / 2; t20 = false; } vec4 top = center + normal; if(t01) make_triangle( gl_in[0].gl_Position, fca[0], gl_in[1].gl_Position, fca[1], top, vec4(1, 1, 1, 1)); if(t12) make_triangle( gl_in[1].gl_Position, fca[1], gl_in[2].gl_Position, fca[2], top, vec4(1, 1, 1, 1)); if(t20) make_triangle( gl_in[2].gl_Position, fca[2], gl_in[0].gl_Position, fca[0], top, vec4(1, 1, 1, 1)); } }