diff --git a/drape_frontend/shaders/colored_symbol.fsh.glsl b/drape_frontend/shaders/colored_symbol.fsh.glsl index 3626c500c6..4730dd2caf 100644 --- a/drape_frontend/shaders/colored_symbol.fsh.glsl +++ b/drape_frontend/shaders/colored_symbol.fsh.glsl @@ -25,8 +25,6 @@ void main() lowp vec4 finalColor = color; finalColor.a = finalColor.a * u_opacity * (1.0 - alpha); - if (finalColor.a == 0.0) - discard; - + discardFragmentIfDepthEnabled(finalColor.a == 0.0); gl_FragColor = finalColor; } diff --git a/drape_frontend/shaders/discarded_texturing.fsh.glsl b/drape_frontend/shaders/discarded_texturing.fsh.glsl index e146c2a18b..08f08fc536 100644 --- a/drape_frontend/shaders/discarded_texturing.fsh.glsl +++ b/drape_frontend/shaders/discarded_texturing.fsh.glsl @@ -11,7 +11,6 @@ void main() { vec4 finalColor = texture2D(u_colorTex, v_colorTexCoords); finalColor.a *= u_opacity; - if (finalColor.a < 0.01) - discard; + discardFragmentIfDepthEnabled(finalColor.a < 0.01); gl_FragColor = finalColor; } diff --git a/drape_frontend/shaders/shaders_lib.glsl b/drape_frontend/shaders/shaders_lib.glsl index 9ff8254129..93302946c7 100644 --- a/drape_frontend/shaders/shaders_lib.glsl +++ b/drape_frontend/shaders/shaders_lib.glsl @@ -46,3 +46,18 @@ vec4 samsungGoogleNexusWorkaround(vec4 color) return color; #endif } + +// This function discards fragment in ES2 mode or writes maximum value to the depth buffer +// in ES3. It helps to avoid 'discard' invocation in cases when usual depth buffer mode is in use. +void discardFragmentIfDepthEnabled(bool needDiscard) +{ +#ifdef GLES3 + if (needDiscard) + gl_FragDepth = 1.0; + else + gl_FragDepth = gl_FragCoord.z; +#else + if (needDiscard) + discard; +#endif +} diff --git a/drape_frontend/shaders/smaa_edges.fsh.glsl b/drape_frontend/shaders/smaa_edges.fsh.glsl index 69322a954d..c847a3f6ef 100644 --- a/drape_frontend/shaders/smaa_edges.fsh.glsl +++ b/drape_frontend/shaders/smaa_edges.fsh.glsl @@ -39,7 +39,7 @@ void main() delta.xy = abs(L - vec2(Lleft, Ltop)); vec2 edges = step(kThreshold, delta.xy); if (dot(edges, vec2(1.0, 1.0)) == 0.0) - discard; + discard; // Calculate right and bottom deltas. float Lright = dot(texture2D(u_colorTex, v_offset1.xy).rgb, kWeights);