Ticket #5124: shadow_filter.patch

File shadow_filter.patch, 3.8 KB (added by aeonios, 6 years ago)
  • binaries/data/mods/public/shaders/glsl/model_common.fs

     
    2626#endif
    2727#endif
    2828
     29#if USE_SHADOW_PCF
     30    uniform vec2 offsets[8] = vec2[](
     31        vec2(-0.353553, 0.612372),
     32        vec2(-0.25, -0.433013),
     33        vec2(0.663414, 0.55667),
     34        vec2(-0.332232, 0.120922),
     35        vec2(0.137281, -0.778559),
     36        vec2(0.106337, 0.603069),
     37        vec2(-0.879002, -0.319931),
     38        vec2(0.191511, -0.160697)
     39        );
     40#endif
     41
    2942uniform vec3 shadingColor;
    3043uniform vec3 ambient;
    3144uniform vec3 sunColor;
     
    7285    float biasedShdwZ = v_shadow.z - shadowBias;
    7386    #if USE_SHADOW_SAMPLER
    7487      #if USE_SHADOW_PCF
    75         vec2 offset = fract(v_shadow.xy - 0.5);
    76         vec4 size = vec4(offset + 1.0, 2.0 - offset);
    77         vec4 weight = (vec4(1.0, 1.0, -0.5, -0.5) + (v_shadow.xy - 0.5*offset).xyxy) * shadowScale.zwzw;
    78         return (1.0/9.0)*dot(size.zxzx*size.wwyy,
    79           vec4(shadow2D(shadowTex, vec3(weight.zw, biasedShdwZ)).r,
    80                shadow2D(shadowTex, vec3(weight.xw, biasedShdwZ)).r,
    81                shadow2D(shadowTex, vec3(weight.zy, biasedShdwZ)).r,
    82                shadow2D(shadowTex, vec3(weight.xy, biasedShdwZ)).r));
    83       #else
    84         return shadow2D(shadowTex, vec3(v_shadow.xy, biasedShdwZ)).r;
    85       #endif
     88            float lit = 0.0;
     89            vec2 uv = v_shadow.xy - (0.5 * fract(v_shadow.xy - 0.5));
     90            float blurRadius = 2.5;
     91           
     92            for (int i = 0; i < 8; i++){
     93                vec2 offset = (uv + offsets[i] * blurRadius) * shadowScale.zw;
     94                lit += shadow2D(shadowTex, vec3(offset, biasedShdwZ)).r;
     95            }
     96           
     97            return lit/8.0;
     98        #else
     99            return shadow2D(shadowTex, vec3(v_shadow.xy, biasedShdwZ)).r;
     100        #endif
    86101    #else
    87102      if (biasedShdwZ >= 1.0)
    88103        return 1.0;
  • binaries/data/mods/public/shaders/glsl/terrain_common.fs

     
    6464  #endif
    6565#endif
    6666
     67#if USE_SHADOW_PCF
     68    uniform vec2 offsets[8] = vec2[](
     69        vec2(-0.353553, 0.612372),
     70        vec2(-0.25, -0.433013),
     71        vec2(0.663414, 0.55667),
     72        vec2(-0.332232, 0.120922),
     73        vec2(0.137281, -0.778559),
     74        vec2(0.106337, 0.603069),
     75        vec2(-0.879002, -0.319931),
     76        vec2(0.191511, -0.160697)
     77        );
     78#endif
     79
    6780float get_shadow()
    6881{
    6982  float shadowBias = 0.0005;
     
    7083  #if USE_SHADOW && !DISABLE_RECEIVE_SHADOWS
    7184    float biasedShdwZ = v_shadow.z - shadowBias;
    7285    #if USE_SHADOW_SAMPLER
    73       #if USE_SHADOW_PCF
    74         vec2 offset = fract(v_shadow.xy - 0.5);
    75         vec4 size = vec4(offset + 1.0, 2.0 - offset);
    76         vec4 weight = (vec4(1.0, 1.0, -0.5, -0.5) + (v_shadow.xy - 0.5*offset).xyxy) * shadowScale.zwzw;
    77         return (1.0/9.0)*dot(size.zxzx*size.wwyy,
    78           vec4(shadow2D(shadowTex, vec3(weight.zw, biasedShdwZ)).r,
    79                shadow2D(shadowTex, vec3(weight.xw, biasedShdwZ)).r,
    80                shadow2D(shadowTex, vec3(weight.zy, biasedShdwZ)).r,
    81                shadow2D(shadowTex, vec3(weight.xy, biasedShdwZ)).r));
    82       #else
    83         return shadow2D(shadowTex, vec3(v_shadow.xy, biasedShdwZ)).r;
    84       #endif
     86        #if USE_SHADOW_PCF
     87            float lit = 0.0;
     88            vec2 uv = v_shadow.xy - (0.5 * fract(v_shadow.xy - 0.5));
     89            float blurRadius = 2.5;
     90           
     91            for (int i = 0; i < 8; i++){
     92                vec2 offset = (uv + offsets[i] * blurRadius) * shadowScale.zw;
     93                lit += shadow2D(shadowTex, vec3(offset, biasedShdwZ)).r;
     94            }
     95           
     96            return lit/8.0;
     97        #else
     98            return shadow2D(shadowTex, vec3(v_shadow.xy, biasedShdwZ)).r;
     99        #endif
    85100    #else
    86101      if (biasedShdwZ >= 1.0)
    87102        return 1.0;