diff --git a/src/renderers/shaders/ShaderLib/depth_frag.glsl.js b/src/renderers/shaders/ShaderLib/depth_frag.glsl.js index c1a75b1caf9c8a..bfaf55cdd32074 100644 --- a/src/renderers/shaders/ShaderLib/depth_frag.glsl.js +++ b/src/renderers/shaders/ShaderLib/depth_frag.glsl.js @@ -13,6 +13,8 @@ export default /* glsl */` #include #include +varying vec2 vHighPrecisionZW; + void main() { #include @@ -31,13 +33,16 @@ void main() { #include + // Higher precision equivalent of gl_FragCoord.z. This assumes depthRange has been left to its default values. + float fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5; + #if DEPTH_PACKING == 3200 - gl_FragColor = vec4( vec3( 1.0 - gl_FragCoord.z ), opacity ); + gl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity ); #elif DEPTH_PACKING == 3201 - gl_FragColor = packDepthToRGBA( gl_FragCoord.z ); + gl_FragColor = packDepthToRGBA( fragCoordZ ); #endif diff --git a/src/renderers/shaders/ShaderLib/depth_vert.glsl.js b/src/renderers/shaders/ShaderLib/depth_vert.glsl.js index 4705257b0601cf..5bc70299875dba 100644 --- a/src/renderers/shaders/ShaderLib/depth_vert.glsl.js +++ b/src/renderers/shaders/ShaderLib/depth_vert.glsl.js @@ -7,6 +7,11 @@ export default /* glsl */` #include #include +// This is used for computing an equivalent of gl_FragCoord.z that is as high precision as possible. +// Some platforms compute gl_FragCoord at a lower precision which makes the manually computed value better for +// depth-based postprocessing effects. Reproduced on iPad with A10 processor / iPadOS 13.3.1. +varying vec2 vHighPrecisionZW; + void main() { #include @@ -29,5 +34,7 @@ void main() { #include #include + vHighPrecisionZW = gl_Position.zw; + } `;