diff --git a/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl b/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl new file mode 100644 index 0000000000000000000000000000000000000000..04b2dda156b074a8bb23045a32420d578d3b0f43 --- /dev/null +++ b/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl @@ -0,0 +1,50 @@ +float getShadowMask() { + + float shadow = 1.0; + + #ifdef USE_SHADOWMAP + + #if NUM_DIR_LIGHTS > 0 + + DirectionalLight directionalLight; + + for ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) { + + directionalLight = directionalLights[ i ]; + shadow *= bool( directionalLight.shadow ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0; + + } + + #endif + + #if NUM_SPOT_LIGHTS > 0 + + SpotLight spotLight; + + for ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) { + + spotLight = spotLights[ i ]; + shadow *= bool( spotLight.shadow ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0; + + } + + #endif + + #if NUM_POINT_LIGHTS > 0 + + PointLight pointLight; + + for ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) { + + pointLight = pointLights[ i ]; + shadow *= bool( pointLight.shadow ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ] ) : 1.0; + + } + + #endif + + #endif + + return shadow; + +} diff --git a/src/renderers/shaders/ShaderLib.js b/src/renderers/shaders/ShaderLib.js index 0e34f7d566245b0744215949a1e8b597655d9746..e61fabe6246252caa552b49d85bba12fae59239b 100644 --- a/src/renderers/shaders/ShaderLib.js +++ b/src/renderers/shaders/ShaderLib.js @@ -104,7 +104,7 @@ THREE.ShaderLib = { THREE.ShaderChunk[ "aomap_fragment" ], - "vec3 outgoingLight = reflectedLight.indirectDiffuse;", + " vec3 outgoingLight = reflectedLight.indirectDiffuse;", THREE.ShaderChunk[ "envmap_fragment" ], THREE.ShaderChunk[ "linear_to_gamma_fragment" ], @@ -213,8 +213,10 @@ THREE.ShaderLib = { THREE.ShaderChunk[ "envmap_pars_fragment" ], THREE.ShaderChunk[ "bsdfs" ], THREE.ShaderChunk[ "ambient_pars" ], + THREE.ShaderChunk[ "lights_pars" ], THREE.ShaderChunk[ "fog_pars_fragment" ], THREE.ShaderChunk[ "shadowmap_pars_fragment" ], + THREE.ShaderChunk[ "shadowmask_pars_fragment" ], THREE.ShaderChunk[ "specularmap_pars_fragment" ], THREE.ShaderChunk[ "logdepthbuf_pars_fragment" ], @@ -249,7 +251,7 @@ THREE.ShaderLib = { " #endif", - " reflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );", + " reflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();", // modulation THREE.ShaderChunk[ "aomap_fragment" ], diff --git a/utils/build/includes/common.json b/utils/build/includes/common.json index 36426a5fd72ada76e3103ac70e5916a1897ea0db..6112f3ce40162798e3ccc08f47f5d4e796625550 100644 --- a/utils/build/includes/common.json +++ b/utils/build/includes/common.json @@ -176,6 +176,7 @@ "src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl", "src/renderers/shaders/ShaderChunk/shadowmap_pars_vertex.glsl", "src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl", + "src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl", "src/renderers/shaders/ShaderChunk/skinbase_vertex.glsl", "src/renderers/shaders/ShaderChunk/skinning_pars_vertex.glsl", "src/renderers/shaders/ShaderChunk/skinning_vertex.glsl",