diff --git a/src/renderers/shaders/ShaderChunk/shadowmap_fragment.glsl b/src/renderers/shaders/ShaderChunk/shadowmap_fragment.glsl index 818de7f7568ed74f86677c6b9c094b267a3daa4f..f9d87789835027322024a6270e2184c6ff11938c 100644 --- a/src/renderers/shaders/ShaderChunk/shadowmap_fragment.glsl +++ b/src/renderers/shaders/ShaderChunk/shadowmap_fragment.glsl @@ -45,8 +45,32 @@ #if defined( SHADOWMAP_TYPE_PCF ) if( isPointLight ){ - - shadow = sampleCubeShadowMapPCF( i, normalize( lightToPosition ), length( lightToPosition ), cubeTexelSize, 1.5); + + initGridSamplingDisk(); + + float diskRadius = 1.5; + float numSamples = 1.0; + shadow = 0.0; + + vec3 baseDirection = normalize( lightToPosition ); + float curDistance = length( lightToPosition ); + + float dist = unpack1K( textureCube( shadowCube[ i ], baseDirection ) ); + if ( curDistance >= dist ) + shadow += 1.0; + + // evaluate each sampling direction + for( int s = 0; s < 20; s++ ){ + + vec3 offset = gridSamplingDisk[ s ] * diskRadius * cubeTexelSize; + dist = unpack1K( textureCube( shadowCube[ i ], vec3( baseDirection + offset ) ) ); + if ( curDistance >= dist ) + shadow += 1.0; + numSamples += 1.0; + + } + + shadow /= numSamples; } else { // Percentage-close filtering @@ -120,7 +144,31 @@ if( isPointLight ){ - shadow = sampleCubeShadowMapPCF( i, normalize( lightToPosition ), length( lightToPosition ), cubeTexelSize, 2.5 ); + initGridSamplingDisk(); + + float diskRadius = 2.5; + float numSamples = 1.0; + shadow = 0.0; + + vec3 baseDirection = normalize( lightToPosition ); + float curDistance = length( lightToPosition ); + + float dist = unpack1K( textureCube( shadowCube[ i ], baseDirection ) ); + if ( curDistance >= dist ) + shadow += 1.0; + + // evaluate each sampling direction + for( int s = 0; s < 20; s++ ){ + + vec3 offset = gridSamplingDisk[ s ] * diskRadius * cubeTexelSize; + dist = unpack1K( textureCube( shadowCube[ i ], vec3( baseDirection + offset ) ) ); + if ( curDistance >= dist ) + shadow += 1.0; + numSamples += 1.0; + + } + + shadow /= numSamples; } else { @@ -179,7 +227,8 @@ if( isPointLight ){ - float dist = getCubeShadowMapFloat( i, normalize( lightToPosition ) ); + vec4 data = textureCube( shadowCube[ i ], normalize( lightToPosition ) ); + float dist = unpack1K( data ); if ( length( lightToPosition ) >= dist) shadowColor = shadowColor * vec3( 1.0 - realShadowDarkness ); diff --git a/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl b/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl index 6a9b1e6592b77fed91dbb42d4315e83dda753637..72298fd716f13c669c0046dfe434ec36f64b6a82 100644 --- a/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl +++ b/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl @@ -36,10 +36,16 @@ } vec3 gridSamplingDisk[ 20 ]; - int gridSamplingInitialized = 0; + bool gridSamplingInitialized = false; void initGridSamplingDisk(){ - + + if( gridSamplingInitialized ){ + + return; + + } + gridSamplingDisk[0] = vec3(1, 1, 1); gridSamplingDisk[1] = vec3(1, -1, 1); gridSamplingDisk[2] = vec3(-1, -1, 1); @@ -60,68 +66,9 @@ gridSamplingDisk[17] = vec3(0, -1, 1); gridSamplingDisk[18] = vec3(0, -1, -1); gridSamplingDisk[19] = vec3(0, 1, -1); - - } - - float getCubeShadowMapFloat( const in int cubeIndex, in vec3 baseDirection ){ - - vec4 data = vec4( 0, 0, 0, 0 ); - - // This loop may seem silly and unnecessary, but we can't use @cubeIndex to access @shadowCube - // directly, since its bounds are unknown to the compiler. The compiler - // knows the bounds of the loop variable 'i' so we CAN use that to index - // into @shadowCube. The alternative to this is to send the samplerCube directly - // to this function as a parameter, but come drivers don't allow that. - - for( int i = 0; i < MAX_SHADOWS; i++ ) { - - if( i == cubeIndex ){ - - data = textureCube(shadowCube[ i ], baseDirection); - break; - - } - } - - float dist = unpack1K( data ); - return dist; - - } - - float sampleCubeShadowMapPCF( const in int cubeIndex, in vec3 baseDirection, in float curDistance, in float texSize, float softness ){ - - if( gridSamplingInitialized == 0 ){ - - initGridSamplingDisk(); - gridSamplingInitialized = 1; - - } - - // radius of PCF depending on distance from the light source - float diskRadius = softness; - float numSamples = 0.0; - float shadowFactor = 0.0; - - float dist = getCubeShadowMapFloat( cubeIndex, baseDirection ); - if ( curDistance >= dist ) - shadowFactor += 1.0; - numSamples += 1.0; + gridSamplingInitialized = true; - // evaluate each sampling direction - for( int i = 0; i < 20; i++ ){ - - vec3 offset = gridSamplingDisk[ i ] * diskRadius * texSize; - dist = getCubeShadowMapFloat( cubeIndex, vec3( baseDirection + offset ) ); - if ( curDistance >= dist ) - shadowFactor += 1.0; - numSamples += 1.0; - - } - - shadowFactor /= numSamples; - return shadowFactor; - } #endif \ No newline at end of file