提交 0f9a9226 编写于 作者: M Mark Kellogg 提交者: mkkellogg

Inlined code from sampleCubeShadowMapPCF() directly into main().

上级 5964cb9b
......@@ -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 );
......
......@@ -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
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册