You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
50 lines
1.5 KiB
50 lines
1.5 KiB
// 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] = determinant(mat2(v0, v1)) / length(v1);
|
|
|
|
EmitVertex();
|
|
}
|
|
}
|
|
|