Wireframe rendering.

This commit is contained in:
2022-02-20 23:47:13 +01:00
parent 6f4a8461a9
commit 906290edfa
9 changed files with 228 additions and 67 deletions

View File

@@ -1,9 +1,28 @@
#version 450
layout(location = 0) in vec3 fragColor;
layout(location = 1) in vec3 in_normal;
layout(location = 2) in vec3 in_color;
layout(location = 3) in vec3 in_edge_dist;
layout(location = 0) out vec4 outColor;
layout(location = 0) out vec4 out_color;
void main() {
outColor = vec4(fragColor, 1.0);
vec3 edge_dist = vec3(0.75) - in_edge_dist;
float edge = clamp(
max(edge_dist[0], max(edge_dist[1], edge_dist[2])),
0.0, 1.0
);
vec3 edge_color = vec3(1.0);
vec3 light_dir = normalize(vec3(-0.2, -0.1, -1.0));
vec3 color = in_color;
// vec3 normal = normalize(in_normal);
// color *= clamp(
// dot(normal, light_dir),
// 0.0, 1.0
// );
out_color = vec4(mix(color, edge_color, edge), 1.0);
}

49
shaders/shader.geom Normal file
View File

@@ -0,0 +1,49 @@
#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();
}
}

View File

@@ -3,17 +3,31 @@
layout(binding = 0) uniform Uniforms {
mat4 scene_from_model;
mat4 projection_from_scene;
vec2 screen_size;
float lod;
} uniforms;
layout(location = 0) in vec3 inPosition;
layout(location = 1) in vec3 inColor;
layout(location = 0) in vec3 in_position;
layout(location = 1) in vec3 in_position2;
layout(location = 2) in vec3 in_normal;
layout(location = 3) in vec3 in_color;
layout(location = 0) out vec3 fragColor;
layout(location = 0) out vec4 out_position;
layout(location = 1) out vec3 out_normal;
layout(location = 2) out vec3 out_color;
void main() {
gl_Position =
float lod = clamp(
2.0 * dot(transpose(uniforms.scene_from_model)[0].xyz, in_position) + 0.5,
0.0, 1.0
);
vec3 position = mix(in_position2, in_position, lod);
out_position =
uniforms.projection_from_scene *
uniforms.scene_from_model *
vec4(inPosition, 1.0);
fragColor = inColor;
vec4(position, 1.0);
out_normal = in_normal;
out_color = in_color;
gl_Position = out_position;
}