1#version 120 2 3uniform float fg_Fcoef; 4 5uniform sampler2D baseTexture; 6uniform float scattering; 7 8varying float fogFactor; 9varying float mie_frag; 10varying float mie_frag_mod; 11varying float z_pos; 12varying float bottom_shade; 13 14varying vec3 internal_pos; 15varying vec3 hazeColor; 16 17varying float flogz; 18 19vec3 filter_combined (in vec3 color) ; 20 21void main(void) 22{ 23 vec4 base = texture2D( baseTexture, gl_TexCoord[0].st); 24 if (base.a < 0.02) 25 discard; 26 27 float mie_factor = 0.0; 28 float geo_factor = 1.0; 29 30 float mie_sign = 1.0; 31 if (mie_frag < 0.0) {mie_sign = -1.0;} 32 33 if (mie_sign > 0.0) 34 {mie_factor = smoothstep(0.8, 1.0, mie_frag);} 35 else 36 {mie_factor = -1.0 * (1.0 - smoothstep(-1.0, -0.8, mie_frag));} 37 38 mie_factor *= mie_frag_mod; 39 40 // suppress effect in cloud center 41 42 float z_bias = 0.2 * (1.0 - smoothstep(2.0, 3.0, z_pos)); 43 44 geo_factor *= smoothstep(-0.9 - z_bias, -0.4 - z_bias, internal_pos.x) * (1.0 -smoothstep(0.4 + z_bias, 0.9 + z_bias, internal_pos.x)); 45 geo_factor *= smoothstep(-0.9 - z_bias, -0.4 - z_bias, internal_pos.y) * (1.0 -smoothstep(0.4 + z_bias, 0.9 + z_bias, internal_pos.y)); 46 geo_factor *= smoothstep(0, 0.3, internal_pos.z) * (1.0 - smoothstep(0.5, 1.2, internal_pos.z)); 47 48 if (mie_sign > 0.0) 49 { 50 mie_factor *=(1.0 -geo_factor); 51 } 52 53 float transparency = smoothstep(0.0, 0.7, base.a); 54 float opacity = smoothstep(0.7, 1.0, base.a); 55 56 float inverse_mie = 0.0; 57 58 if ((opacity == 0.0) && (mie_sign > 0.0)) // Mie forward scattering enhancing light 59 {mie_factor *= (1.0 - pow(transparency, 2.0));} 60 else if ((opacity == 0.0) && (mie_sign < 0.0)) // Mie forward scattering reducing reflected light 61 { 62 inverse_mie = (1.0 - pow(transparency, 2.0)) * smoothstep(0.65, 0.8, scattering); 63 inverse_mie *= (1.0 - smoothstep(-1.0, -0.5, mie_frag)); 64 } 65 else if (mie_sign > 0.0) // bulk light absorption 66 {mie_factor *= - 4.0 * pow(opacity, 2.0);} 67 68 69 // darken the bulk of the away-facing cloud 70 71 float bulk_shade_factor = (1.0 - 0.6 * geo_factor * smoothstep(0.5, 1.0, mie_frag)); 72 bulk_shade_factor -= 0.3 * smoothstep(0.5, 1.0, mie_frag) * (1.0 - mie_frag_mod) * (1.0 - smoothstep(0.4, 0.5, bottom_shade)); 73 74 75 float mie_enhancement = 1.0 + clamp(mie_factor, 0.0, 1.0); 76 mie_enhancement = mie_enhancement * bulk_shade_factor; 77 78 vec4 finalColor = base * gl_Color; 79 finalColor.rgb *= mie_enhancement * (1.0 - 0.4 * inverse_mie); 80 finalColor.rgb = max(finalColor.rgb, gl_Color.rgb * 1.2 * bottom_shade); 81 82 finalColor.rgb = mix(hazeColor, finalColor.rgb, fogFactor ); 83 finalColor.rgb = filter_combined(finalColor.rgb); 84 85 86 gl_FragColor.rgb = finalColor.rgb; 87 gl_FragColor.a = mix(0.0, finalColor.a, 1.0 - 0.5 * (1.0 - fogFactor)); 88 // logarithmic depth 89 gl_FragDepth = log2(flogz) * fg_Fcoef * 0.5; 90} 91