diff --git a/Effects/sunlight.eff b/Effects/sunlight.eff index 444b92985..b8ae97300 100644 --- a/Effects/sunlight.eff +++ b/Effects/sunlight.eff @@ -4,9 +4,15 @@ /sim/rendering/shadows/filtering - + - /sim/rendering/shadows/enabled + + /sim/rendering/shadows/enabled + + 1.0 + /sim/rendering/shadows/filtering + + false @@ -90,6 +96,92 @@ --> + + + /sim/rendering/shadows/enabled + + + false + + false + + + one + one + + + 1 + RenderBin + + + 0 + buffer + depth + + + 1 + buffer + normal + + + 2 + buffer + diffuse + + + 3 + buffer + spec-emis + + + 4 + buffer + shadow + + + Shaders/sunlight.vert + Shaders/sunlight-nofiltering.frag + Shaders/gbuffer-functions.frag + + + depth_tex + sampler-2d + 0 + + + normal_tex + sampler-2d + 1 + + + color_tex + sampler-2d + 2 + + + spec_emis_tex + sampler-2d + 3 + + + shadow_tex + sampler-2d + 4 + + + + false diff --git a/Shaders/sunlight-nofiltering.frag b/Shaders/sunlight-nofiltering.frag new file mode 100644 index 000000000..80ea77f54 --- /dev/null +++ b/Shaders/sunlight-nofiltering.frag @@ -0,0 +1,78 @@ +uniform mat4 fg_ViewMatrix; +uniform sampler2D depth_tex; +uniform sampler2D normal_tex; +uniform sampler2D color_tex; +uniform sampler2D spec_emis_tex; +uniform sampler2DShadow shadow_tex; +uniform vec4 fg_SunDiffuseColor; +uniform vec4 fg_SunSpecularColor; +uniform vec3 fg_SunDirection; +uniform vec3 fg_Planes; +uniform int fg_ShadowNumber; +uniform vec4 fg_ShadowDistances; +varying vec3 ray; + +vec3 position( vec3 viewdir, float depth ); +vec3 normal_decode(vec2 enc); + +vec4 DynamicShadow( in vec4 ecPosition, out vec4 tint ) +{ + vec4 coords; + vec2 shift = vec2( 0.0 ); + int index = 4; + float factor = 0.5; + if (ecPosition.z > -fg_ShadowDistances.x) { + index = 1; + if (fg_ShadowNumber == 1) + factor = 1.0; + tint = vec4(0.0,1.0,0.0,1.0); + } else if (ecPosition.z > -fg_ShadowDistances.y && fg_ShadowNumber > 1) { + index = 2; + shift = vec2( 0.0, 0.5 ); + tint = vec4(0.0,0.0,1.0,1.0); + } else if (ecPosition.z > -fg_ShadowDistances.z && fg_ShadowNumber > 2) { + index = 3; + shift = vec2( 0.5, 0.0 ); + tint = vec4(1.0,1.0,0.0,1.0); + } else if (ecPosition.z > -fg_ShadowDistances.w && fg_ShadowNumber > 3) { + shift = vec2( 0.5, 0.5 ); + tint = vec4(1.0,0.0,0.0,1.0); + } else { + return vec4(1.1,1.1,0.0,1.0); // outside, clamp to border + } + coords.s = dot( ecPosition, gl_EyePlaneS[index] ); + coords.t = dot( ecPosition, gl_EyePlaneT[index] ); + coords.p = dot( ecPosition, gl_EyePlaneR[index] ); + coords.q = dot( ecPosition, gl_EyePlaneQ[index] ); + coords.st *= factor; + coords.st += shift; + return coords; +} +void main() { + vec2 coords = gl_TexCoord[0].xy; + vec4 spec_emis = texture2D( spec_emis_tex, coords ); + if ( spec_emis.a < 0.1 ) + discard; + vec3 normal = normal_decode(texture2D( normal_tex, coords ).rg); + float len = length(normal); + normal /= len; + vec3 viewDir = normalize(ray); + vec3 pos = position( viewDir, texture2D( depth_tex, coords ).r ); + + vec4 tint; + float shadow = shadow2DProj( shadow_tex, DynamicShadow( vec4( pos, 1.0 ), tint ) ).r; + vec3 lightDir = (fg_ViewMatrix * vec4( fg_SunDirection, 0.0 )).xyz; + lightDir = normalize( lightDir ); + vec3 color = texture2D( color_tex, coords ).rgb; + vec3 Idiff = clamp( dot( lightDir, normal ), 0.0, 1.0 ) * color * fg_SunDiffuseColor.rgb; + vec3 halfDir = lightDir - viewDir; + len = length( halfDir ); + vec3 Ispec = vec3(0.0); + vec3 Iemis = spec_emis.z * color; + if (len > 0.0001) { + halfDir /= len; + Ispec = pow( clamp( dot( halfDir, normal ), 0.0, 1.0 ), spec_emis.y * 128.0 ) * spec_emis.x * fg_SunSpecularColor.rgb; + } + gl_FragColor = vec4(mix(vec3(0.0), Idiff + Ispec, shadow) + Iemis, 1.0); +// gl_FragColor = mix(tint, vec4(mix(vec3(0.0), Idiff + Ispec, shadow) + Iemis, 1.0), 0.92); +} diff --git a/Shaders/sunlight.frag b/Shaders/sunlight.frag index c1e812d18..6f5578342 100644 --- a/Shaders/sunlight.frag +++ b/Shaders/sunlight.frag @@ -1,3 +1,4 @@ +#version 120 uniform mat4 fg_ViewMatrix; uniform sampler2D depth_tex; uniform sampler2D normal_tex; @@ -71,12 +72,12 @@ void main() { shadow += 0.166 * shadow2DProj( shadow_tex, DynamicShadow( vec4(pos + vec3(-0.003 * pos.z, 0.002 * pos.z, 0), 1.0), tint ) ).r; shadow += 0.166 * shadow2DProj( shadow_tex, DynamicShadow( vec4(pos + vec3( 0.003 * pos.z, -0.002 * pos.z, 0), 1.0), tint ) ).r; } else { - float kernel[9] = float[]( 36/256.0, 24/256.0, 6/256.0, + float kernel[9] = float[9]( 36/256.0, 24/256.0, 6/256.0, 24/256.0, 16/256.0, 4/256.0, 6/256.0, 4/256.0, 1/256.0 ); for( int x = -2; x <= 2; ++x ) for( int y = -2; y <= 2; ++y ) - shadow += kernel[abs(x)*3 + abs(y)] * shadow2DProj( shadow_tex, DynamicShadow( vec4(pos + vec3(-0.0025 * x * pos.z, -0.0025 * y * pos.z, 0), 1.0), tint ) ).r; + shadow += kernel[int(abs(float(x))*3 + abs(float(y)))] * shadow2DProj( shadow_tex, DynamicShadow( vec4(pos + vec3(-0.0025 * x * pos.z, -0.0025 * y * pos.z, 0), 1.0), tint ) ).r; } vec3 lightDir = (fg_ViewMatrix * vec4( fg_SunDirection, 0.0 )).xyz; lightDir = normalize( lightDir );