// Copyright 2022 Simon Boyé #version 450 layout(triangles) in; layout(triangle_strip, max_vertices=3) out; layout(binding = 0) uniform Uniforms { mat4 scene_from_model; mat4 projection_from_scene; vec2 half_screen_size; float lod; } uniforms; layout(location = 0) in vec4 in_position[3]; layout(location = 1) in vec3 in_normal[3]; layout(location = 2) in vec3 in_color[3]; layout(location = 0) out vec4 out_position; layout(location = 1) out vec3 out_normal; layout(location = 2) out vec3 out_color; layout(location = 3) noperspective out vec3 out_edge_dist; void main() { vec2 positions[3] = { uniforms.half_screen_size * gl_in[0].gl_Position.xy / gl_in[0].gl_Position.w, uniforms.half_screen_size * gl_in[1].gl_Position.xy / gl_in[1].gl_Position.w, uniforms.half_screen_size * gl_in[2].gl_Position.xy / gl_in[2].gl_Position.w, }; for(int i = 0; i < 3; i += 1) { gl_Position = gl_in[i].gl_Position; out_position = in_position[i]; out_normal = in_normal[i]; out_color = in_color[i]; out_edge_dist = vec3(0.0); vec2 p0 = positions[(i + 0) % 3]; vec2 p1 = positions[(i + 1) % 3]; vec2 p2 = positions[(i + 2) % 3]; // vec2 v21 = p2 - p1; // out_edge_dist[i] = (p1.x * v21.x + p1.y * v21.y) / dot(v21, v21); vec2 v0 = p0 - p2; vec2 v1 = p1 - p2; out_edge_dist[i] = abs(determinant(mat2(v0, v1))) / length(v1); EmitVertex(); } }