9 changed files with 229 additions and 68 deletions
@ -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); |
|||
} |
|||
|
|||
@ -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(); |
|||
} |
|||
} |
|||
Loading…
Reference in new issue