diff options
Diffstat (limited to 'source/blender/draw/engines/overlay/shaders/overlay_wireframe_frag.glsl')
-rw-r--r-- | source/blender/draw/engines/overlay/shaders/overlay_wireframe_frag.glsl | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/source/blender/draw/engines/overlay/shaders/overlay_wireframe_frag.glsl b/source/blender/draw/engines/overlay/shaders/overlay_wireframe_frag.glsl new file mode 100644 index 00000000000..bc28d7a8a36 --- /dev/null +++ b/source/blender/draw/engines/overlay/shaders/overlay_wireframe_frag.glsl @@ -0,0 +1,44 @@ + +#pragma BLENDER_REQUIRE(common_view_lib.glsl) + +void main() +{ + /* Needed only because of wireframe slider. + * If we could get rid of it would be nice because of performance drain of discard. */ + if (edgeStart.r == -1.0) { + discard; + } + +#ifndef SELECT_EDGES + lineOutput = pack_line_data(gl_FragCoord.xy, edgeStart, edgePos); + fragColor = finalColor; + +# ifdef CUSTOM_DEPTH_BIAS + vec2 dir = lineOutput.xy * 2.0 - 1.0; + bool dir_horiz = abs(dir.x) > abs(dir.y); + + vec2 uv = gl_FragCoord.xy * drw_view.viewport_size_inverse; + float depth_occluder = texture(depthTex, uv).r; + float depth_min = depth_occluder; + vec2 texel_uv_size = drw_view.viewport_size_inverse; + + if (dir_horiz) { + depth_min = min(depth_min, texture(depthTex, uv + vec2(-texel_uv_size.x, 0.0)).r); + depth_min = min(depth_min, texture(depthTex, uv + vec2(texel_uv_size.x, 0.0)).r); + } + else { + depth_min = min(depth_min, texture(depthTex, uv + vec2(0, -texel_uv_size.y)).r); + depth_min = min(depth_min, texture(depthTex, uv + vec2(0, texel_uv_size.y)).r); + } + + float delta = abs(depth_occluder - depth_min); + + if (gl_FragCoord.z < (depth_occluder + delta) && gl_FragCoord.z > depth_occluder) { + gl_FragDepth = depth_occluder; + } + else { + gl_FragDepth = gl_FragCoord.z; + } +# endif +#endif +} |