diff options
Diffstat (limited to 'source/blender/draw/modes/shaders/overlay_face_wireframe_frag.glsl')
-rw-r--r-- | source/blender/draw/modes/shaders/overlay_face_wireframe_frag.glsl | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/source/blender/draw/modes/shaders/overlay_face_wireframe_frag.glsl b/source/blender/draw/modes/shaders/overlay_face_wireframe_frag.glsl new file mode 100644 index 00000000000..5dfbb4352e4 --- /dev/null +++ b/source/blender/draw/modes/shaders/overlay_face_wireframe_frag.glsl @@ -0,0 +1,53 @@ +uniform vec3 wireColor; +uniform vec3 rimColor; + +flat in vec3 ssVec0; +flat in vec3 ssVec1; +flat in vec3 ssVec2; +in float facing; + +#ifdef LIGHT_EDGES +flat in vec3 edgeSharpness; +#endif + +out vec4 fragColor; + +float min_v3(vec3 v) { return min(v.x, min(v.y, v.z)); } +float max_v3(vec3 v) { return max(v.x, max(v.y, v.z)); } + +/* In pixels */ +const float wire_size = 0.0; /* Expands the core of the wire (part that is 100% wire color) */ +const float wire_smooth = 1.2; /* Smoothing distance after the 100% core. */ + +/* Alpha constants could be exposed in the future. */ +const float front_alpha = 0.35; +const float rim_alpha = 0.75; + +void main() +{ + vec3 ss_pos = vec3(gl_FragCoord.xy, 1.0); + vec3 dist_to_edge = vec3( + dot(ss_pos, ssVec0), + dot(ss_pos, ssVec1), + dot(ss_pos, ssVec2) + ); + +#ifdef LIGHT_EDGES + vec3 fac = abs(dist_to_edge); +#else + float fac = min_v3(abs(dist_to_edge)); +#endif + + fac = smoothstep(wire_size + wire_smooth, wire_size, fac); + + float facing_clamped = clamp((gl_FrontFacing) ? facing : -facing, 0.0, 1.0); + + vec3 final_front_col = mix(rimColor, wireColor, 0.05); + fragColor = mix(vec4(rimColor, rim_alpha), vec4(final_front_col, front_alpha), facing_clamped); + +#ifdef LIGHT_EDGES + fragColor.a *= max_v3(fac * edgeSharpness); +#else + fragColor.a *= fac; +#endif +} |