Fix depth offset in paint mode wireframe.
authorAlexander Gavrilov <angavrilov@gmail.com>
Thu, 29 Nov 2018 14:51:25 +0000 (17:51 +0300)
committerAlexander Gavrilov <angavrilov@gmail.com>
Thu, 29 Nov 2018 14:51:43 +0000 (17:51 +0300)
The original offset was wrong because it applied a constant to
homogenous coordinates (the actual depth is z/w), which broke
totally if near clip distance was reduced.

A correct depth offset has to take slope into account like
glPolygonOffset in order to avoid dotted lines caused by
interpolation precision variations. When drawing wire lines
however only the slope of the line itself is accessible, so
also generally increase the offset when the object is close.

source/blender/draw/modes/shaders/paint_wire_frag.glsl
source/blender/draw/modes/shaders/paint_wire_vert.glsl

index b6637fea308eb6dba5c02cfae7fecb9ecfdfc11f..c5d6198fc21ad2294ed9003a8ede8b365d6b934f 100644 (file)
@@ -11,6 +11,9 @@ void main()
                discard;
        }
 
+       /* Apply depth offset by taking slope and distance into account. */
+       gl_FragDepth = gl_FragCoord.z - mix(exp2(-10), exp2(-23), gl_FragCoord.z) - 2.0 * fwidth(gl_FragCoord.z);
+
 #ifdef VERTEX_MODE
        vec4 colSel = colorEdgeSelect;
        colSel.rgb = clamp(colSel.rgb - 0.2, 0.0, 1.0);
index 6a800e56d94c9183ca733a1eab60787a5bd736fa..253c21745e22bed8970e4a9fd0869946210f5966 100644 (file)
@@ -10,8 +10,5 @@ void main()
 {
        gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0);
 
-       /* Temp hack for william to start using blender 2.8 for icons. Will be removed by T54910 */
-       gl_Position.z -= 0.0001;
-
        finalFlag = data;
 }