Experimentation using Vulkan.
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

// 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();
}
}