提交 73cb0bf6 编写于 作者: A alteredq

Added percentage-close filtering to shadow map shader.

Nine tap sampling, by default it's on, switch off with:

renderer.shadowMapSoft = false;
上级 5fd7ee2f
此差异已折叠。
此差异已折叠。
......@@ -105,6 +105,7 @@ THREE.WebGLRenderer = function ( parameters ) {
this.shadowMap = [];
this.shadowMapEnabled = false;
this.shadowMapSoft = true;
var _cameraLight,
_shadowMatrix = [];
......@@ -2646,6 +2647,9 @@ THREE.WebGLRenderer = function ( parameters ) {
maxDirLights: maxLightCount.directional, maxPointLights: maxLightCount.point,
maxBones: maxBones,
shadowMapEnabled: this.shadowMapEnabled && object.receiveShadow,
shadowMapSoft: this.shadowMapSoft,
shadowMapWidth: this.shadowMapWidth,
shadowMapHeight: this.shadowMapHeight,
maxShadows: maxShadows
};
......@@ -5070,7 +5074,9 @@ THREE.WebGLRenderer = function ( parameters ) {
parameters.vertexColors ? "#define USE_COLOR" : "",
parameters.skinning ? "#define USE_SKINNING" : "",
parameters.morphTargets ? "#define USE_MORPHTARGETS" : "",
parameters.shadowMapEnabled ? "#define USE_SHADOWMAP" : "",
parameters.shadowMapSoft ? "#define SHADOWMAP_SOFT" : "",
parameters.sizeAttenuation ? "#define USE_SIZEATTENUATION" : "",
......@@ -5138,7 +5144,11 @@ THREE.WebGLRenderer = function ( parameters ) {
parameters.envMap ? "#define USE_ENVMAP" : "",
parameters.lightMap ? "#define USE_LIGHTMAP" : "",
parameters.vertexColors ? "#define USE_COLOR" : "",
parameters.shadowMapEnabled ? "#define USE_SHADOWMAP" : "",
parameters.shadowMapSoft ? "#define SHADOWMAP_SOFT" : "",
parameters.shadowMapSoft ? "#define SHADOWMAP_WIDTH " + parameters.shadowMapWidth.toFixed( 1 ) : "",
parameters.shadowMapSoft ? "#define SHADOWMAP_HEIGHT " + parameters.shadowMapHeight.toFixed( 1 ) : "",
"uniform mat4 viewMatrix;",
"uniform vec3 cameraPosition;",
......
......@@ -559,22 +559,63 @@ THREE.ShaderChunk = {
"#ifdef USE_SHADOWMAP",
"#ifdef SHADOWMAP_SOFT",
"const float xPixelOffset = 1.0 / SHADOWMAP_WIDTH;",
"const float yPixelOffset = 1.0 / SHADOWMAP_HEIGHT;",
"#endif",
"vec4 shadowColor = vec4( 1.0 );",
"for( int i = 0; i < MAX_SHADOWS; i ++ ) {",
"vec3 shadowCoord = vShadowCoord[ i ].xyz / vShadowCoord[ i ].w;",
"vec4 rgbaDepth = texture2D( shadowMap[ i ], shadowCoord.xy );",
"float fDepth = unpackDepth( rgbaDepth );",
"if ( shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0 ) {",
"#ifdef SHADOWMAP_SOFT",
// Percentage-close filtering
// (9 pixel kernel)
// http://fabiensanglard.net/shadowmappingPCF/
"float shadow = 0.0;",
"if ( fDepth < ( shadowCoord.z + shadowBias ) && ( shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0 ) )",
"for ( float y = -1.25; y <= 1.25; y += 1.25 )",
"for ( float x = -1.25; x <= 1.25; x += 1.25 ) {",
// spot with multiple shadows is darker
"shadowColor = shadowColor * vec4( vec3( shadowDarkness ), 1.0 );",
"vec4 rgbaDepth = texture2D( shadowMap[ i ], vec2( x * xPixelOffset, y * yPixelOffset ) + shadowCoord.xy );",
"float fDepth = unpackDepth( rgbaDepth );",
"if ( fDepth < ( shadowCoord.z + shadowBias ) )",
"shadow += 1.0;",
"}",
"shadow /= 9.0;",
"shadowColor = shadowColor * vec4( vec3( ( 1.0 - shadowDarkness * shadow ) ), 1.0 );",
"#else",
"vec4 rgbaDepth = texture2D( shadowMap[ i ], shadowCoord.xy );",
"float fDepth = unpackDepth( rgbaDepth );",
"if ( fDepth < ( shadowCoord.z + shadowBias ) )",
// spot with multiple shadows is darker
"shadowColor = shadowColor * vec4( vec3( shadowDarkness ), 1.0 );",
// spot with multiple shadows has the same color as single shadow spot
//"shadowColor = min( shadowColor, vec4( vec3( shadowDarkness ), 1.0 ) );",
"#endif",
"}",
// spot with multiple shadows has the same color as single shadow spot
//"shadowColor = min( shadowColor, vec4( vec3( shadowDarkness ), 1.0 ) );",
// uncomment to see light frustum boundaries
//"if ( !( shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0 ) )",
......@@ -1045,7 +1086,7 @@ THREE.ShaderLib = {
"void main() {",
"vec4 pos = objectMatrix * vec4( position, 1.0 );",
"vec3 norm = mat3( objectMatrix[0].xyz, objectMatrix[1].xyz, objectMatrix[2].xyz ) * normal;",
"vec3 norm = mat3( objectMatrix[ 0 ].xyz, objectMatrix[ 1 ].xyz, objectMatrix[ 2 ].xyz ) * normal;",
"vec4 extruded = vec4( directionalLightDirection * 5000.0 * step( 0.0, dot( directionalLightDirection, norm ) ), 0.0 );",
"gl_Position = projectionMatrix * viewMatrix * ( pos + extruded );",
......@@ -1359,7 +1400,9 @@ THREE.ShaderLib = {
THREE.ShaderChunk[ "color_vertex" ],
"#ifndef USE_ENVMAP",
"vec4 mPosition = objectMatrix * vec4( position, 1.0 );",
"#endif",
"vViewPosition = cameraPosition - mPosition.xyz;",
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册