export declare const background_frag = "\nprecision mediump float;\nprecision mediump samplerCube;\nprecision mediump sampler2D;\n\n#if defined(dVariant_skybox)\n    uniform samplerCube tSkybox;\n    uniform mat4 uViewDirectionProjectionInverse;\n    uniform float uBlur;\n    uniform float uOpacity;\n    uniform float uSaturation;\n    uniform float uLightness;\n    uniform mat3 uRotation;\n#elif defined(dVariant_image)\n    uniform sampler2D tImage;\n    uniform vec2 uImageScale;\n    uniform vec2 uImageOffset;\n    uniform float uBlur;\n    uniform float uOpacity;\n    uniform float uSaturation;\n    uniform float uLightness;\n#elif defined(dVariant_horizontalGradient) || defined(dVariant_radialGradient)\n    uniform vec3 uGradientColorA;\n    uniform vec3 uGradientColorB;\n    uniform float uGradientRatio;\n#endif\n\nuniform vec2 uTexSize;\nuniform vec4 uViewport;\nuniform bool uViewportAdjusted;\nvarying vec4 vPosition;\n\n// TODO: add as general pp option to remove banding?\n// Iestyn's RGB dither from http://alex.vlachos.com/graphics/Alex_Vlachos_Advanced_VR_Rendering_GDC2015.pdf\nvec3 ScreenSpaceDither(vec2 vScreenPos) {\n    vec3 vDither = vec3(dot(vec2(171.0, 231.0), vScreenPos.xy));\n    vDither.rgb = fract(vDither.rgb / vec3(103.0, 71.0, 97.0));\n    return vDither.rgb / 255.0;\n}\n\nvec3 saturateColor(vec3 c, float amount) {\n    // https://www.w3.org/TR/WCAG21/#dfn-relative-luminance\n    const vec3 W = vec3(0.2125, 0.7154, 0.0721);\n    vec3 intensity = vec3(dot(c, W));\n    return mix(intensity, c, 1.0 + amount);\n}\n\nvec3 lightenColor(vec3 c, float amount) {\n    return c + amount;\n}\n\nvoid main() {\n    #if defined(dVariant_skybox)\n        vec4 t = uViewDirectionProjectionInverse * vPosition;\n        #ifdef enabledShaderTextureLod\n            gl_FragColor = textureCubeLodEXT(tSkybox, uRotation * normalize(t.xyz / t.w), uBlur * 8.0);\n        #else\n            gl_FragColor = textureCube(tSkybox, uRotation * normalize(t.xyz / t.w));\n        #endif\n        gl_FragColor.a = uOpacity;\n        gl_FragColor.rgb = lightenColor(saturateColor(gl_FragColor.rgb, uSaturation), uLightness);\n    #elif defined(dVariant_image)\n        vec2 coords;\n        if (uViewportAdjusted) {\n            coords = ((gl_FragCoord.xy - uViewport.xy) * (uTexSize / uViewport.zw) / uImageScale) + uImageOffset;\n        } else {\n            coords = (gl_FragCoord.xy / uImageScale) + uImageOffset;\n        }\n        #ifdef enabledShaderTextureLod\n            gl_FragColor = texture2DLodEXT(tImage, vec2(coords.x, 1.0 - coords.y), uBlur * 8.0);\n        #else\n            gl_FragColor = texture2D(tImage, vec2(coords.x, 1.0 - coords.y));\n        #endif\n        gl_FragColor.a = uOpacity;\n        gl_FragColor.rgb = lightenColor(saturateColor(gl_FragColor.rgb, uSaturation), uLightness);\n    #elif defined(dVariant_horizontalGradient)\n        float d;\n        if (uViewportAdjusted) {\n            d = ((gl_FragCoord.y - uViewport.y) * (uTexSize.y / uViewport.w) / uTexSize.y) + 1.0 - (uGradientRatio * 2.0);\n        } else {\n            d = (gl_FragCoord.y / uTexSize.y) + 1.0 - (uGradientRatio * 2.0);\n        }\n        gl_FragColor = vec4(mix(uGradientColorB, uGradientColorA, clamp(d, 0.0, 1.0)), 1.0);\n        gl_FragColor.rgb += ScreenSpaceDither(gl_FragCoord.xy);\n    #elif defined(dVariant_radialGradient)\n        float d;\n        if (uViewportAdjusted) {\n            d = distance(vec2(0.5), (gl_FragCoord.xy - uViewport.xy) * (uTexSize / uViewport.zw) / uTexSize) + uGradientRatio - 0.5;\n        } else {\n            d = distance(vec2(0.5), gl_FragCoord.xy / uTexSize) + uGradientRatio - 0.5;\n        }\n        gl_FragColor = vec4(mix(uGradientColorB, uGradientColorA, 1.0 - clamp(d, 0.0, 1.0)), 1.0);\n        gl_FragColor.rgb += ScreenSpaceDither(gl_FragCoord.xy);\n    #endif\n}\n";
