|
|
@@ -1,4 +1,4 @@
|
|
|
-import { float, vec2, vec4, If, Fn } from '../tsl/TSLBase.js';
|
|
|
+import { float, vec2, vec4, If, Fn, ivec2 } from '../tsl/TSLBase.js';
|
|
|
import { reference } from '../accessors/ReferenceNode.js';
|
|
|
import { texture } from '../accessors/TextureNode.js';
|
|
|
import { mix, fract, step, max, clamp } from '../math/MathNode.js';
|
|
|
@@ -97,69 +97,38 @@ export const PCFShadowFilter = /*@__PURE__*/ Fn( ( { depthTexture, shadowCoord,
|
|
|
*/
|
|
|
export const PCFSoftShadowFilter = /*@__PURE__*/ Fn( ( { depthTexture, shadowCoord, shadow, depthLayer } ) => {
|
|
|
|
|
|
- const depthCompare = ( uv, compare ) => {
|
|
|
+ const mapSize = reference( 'mapSize', 'vec2', shadow ).setGroup( renderGroup );
|
|
|
|
|
|
- let depth = texture( depthTexture, uv );
|
|
|
+ const texelSize = vec2( 1 ).div( mapSize );
|
|
|
|
|
|
- if ( depthTexture.isArrayTexture ) {
|
|
|
+ const uv = shadowCoord.xy;
|
|
|
+ const f = fract( uv.mul( mapSize ).add( 0.5 ) ).toConst();
|
|
|
+ uv.subAssign( f.sub( 0.5 ).mul( texelSize ) );
|
|
|
|
|
|
- depth = depth.depth( depthLayer );
|
|
|
+ const gatherCompare = ( offset ) => {
|
|
|
|
|
|
- }
|
|
|
+ let t = texture( depthTexture, uv ).offset( offset ).gather();
|
|
|
|
|
|
- return depth.compare( compare );
|
|
|
+ if ( depthTexture.isArrayTexture ) {
|
|
|
|
|
|
- };
|
|
|
+ t = t.depth( depthLayer );
|
|
|
|
|
|
+ }
|
|
|
|
|
|
- const mapSize = reference( 'mapSize', 'vec2', shadow ).setGroup( renderGroup );
|
|
|
+ return t.compare( shadowCoord.z );
|
|
|
|
|
|
- const texelSize = vec2( 1 ).div( mapSize );
|
|
|
- const dx = texelSize.x;
|
|
|
- const dy = texelSize.y;
|
|
|
+ };
|
|
|
|
|
|
- const uv = shadowCoord.xy;
|
|
|
- const f = fract( uv.mul( mapSize ).add( 0.5 ) );
|
|
|
- uv.subAssign( f.mul( texelSize ) );
|
|
|
+ const c1 = gatherCompare( ivec2( - 1, 1 ) ).toConst();
|
|
|
+ const c2 = gatherCompare( ivec2( 1, 1 ) ).toConst();
|
|
|
+ const c3 = gatherCompare( ivec2( - 1, - 1 ) ).toConst();
|
|
|
+ const c4 = gatherCompare( ivec2( 1, - 1 ) ).toConst();
|
|
|
|
|
|
return add(
|
|
|
- depthCompare( uv, shadowCoord.z ),
|
|
|
- depthCompare( uv.add( vec2( dx, 0 ) ), shadowCoord.z ),
|
|
|
- depthCompare( uv.add( vec2( 0, dy ) ), shadowCoord.z ),
|
|
|
- depthCompare( uv.add( texelSize ), shadowCoord.z ),
|
|
|
- mix(
|
|
|
- depthCompare( uv.add( vec2( dx.negate(), 0 ) ), shadowCoord.z ),
|
|
|
- depthCompare( uv.add( vec2( dx.mul( 2 ), 0 ) ), shadowCoord.z ),
|
|
|
- f.x
|
|
|
- ),
|
|
|
- mix(
|
|
|
- depthCompare( uv.add( vec2( dx.negate(), dy ) ), shadowCoord.z ),
|
|
|
- depthCompare( uv.add( vec2( dx.mul( 2 ), dy ) ), shadowCoord.z ),
|
|
|
- f.x
|
|
|
- ),
|
|
|
- mix(
|
|
|
- depthCompare( uv.add( vec2( 0, dy.negate() ) ), shadowCoord.z ),
|
|
|
- depthCompare( uv.add( vec2( 0, dy.mul( 2 ) ) ), shadowCoord.z ),
|
|
|
- f.y
|
|
|
- ),
|
|
|
- mix(
|
|
|
- depthCompare( uv.add( vec2( dx, dy.negate() ) ), shadowCoord.z ),
|
|
|
- depthCompare( uv.add( vec2( dx, dy.mul( 2 ) ) ), shadowCoord.z ),
|
|
|
- f.y
|
|
|
- ),
|
|
|
- mix(
|
|
|
- mix(
|
|
|
- depthCompare( uv.add( vec2( dx.negate(), dy.negate() ) ), shadowCoord.z ),
|
|
|
- depthCompare( uv.add( vec2( dx.mul( 2 ), dy.negate() ) ), shadowCoord.z ),
|
|
|
- f.x
|
|
|
- ),
|
|
|
- mix(
|
|
|
- depthCompare( uv.add( vec2( dx.negate(), dy.mul( 2 ) ) ), shadowCoord.z ),
|
|
|
- depthCompare( uv.add( vec2( dx.mul( 2 ), dy.mul( 2 ) ) ), shadowCoord.z ),
|
|
|
- f.x
|
|
|
- ),
|
|
|
- f.y
|
|
|
- )
|
|
|
+ mix( c1.x, c2.y, f.x ).add( c1.y ).add( c2.x ).mul( f.y ),
|
|
|
+ mix( c1.w, c2.z, f.x ).add( c1.z ).add( c2.w ),
|
|
|
+ mix( c3.x, c4.y, f.x ).add( c3.y ).add( c4.x ),
|
|
|
+ mix( c3.w, c4.z, f.x ).add( c3.z ).add( c4.w ).mul( f.y.oneMinus() )
|
|
|
).mul( 1 / 9 );
|
|
|
|
|
|
} );
|