Wireframe rendering.
This commit is contained in:
@@ -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
49
shaders/shader.geom
Normal 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();
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user