浏览代码

shader update

Garrett Johnson 5 年之前
父节点
当前提交
07b9f90ee4
共有 1 个文件被更改,包括 25 次插入10 次删除
  1. 25 10
      examples/jsm/csm/Shader.js

+ 25 - 10
examples/jsm/csm/Shader.js

@@ -83,24 +83,39 @@ IncidentLight directLight;
 		directionalLight = directionalLights[ i ];
 		getDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );
 
-		float margin = ( 0.25 * ( pow( linearDepth, 2.0 ) ) );
-		float csmx = CSM_cascades[ i ].x - margin;
-		float csmy = CSM_cascades[ i ].y + margin;
-		if(i < NUM_DIR_LIGHT_SHADOWS && linearDepth >=csmx - margin && linearDepth < csmy + margin ) {
+		float margin = 0.25 * pow( linearDepth, 2.0 );
+		float csmx = CSM_cascades[ i ].x - margin / 2.0;
+		float csmy = CSM_cascades[ i ].y + margin / 2.0;
+		float dist = min( linearDepth - csmx, csmy - linearDepth );
+		float ratio = min( dist / margin, 1.0 );
+		if(i < NUM_DIR_LIGHT_SHADOWS && linearDepth >= csmx && linearDepth < csmy ) {
+
+			vec3 prevColor = directLight.color;
+			directionalLightShadow = directionalLightShadows[ i ];
+			directLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;
 
-			float dist = min( linearDepth -csmx, csmy - linearDepth );
-			dist = min( dist / margin, 1.0 );
+			if ( i == CSM_CASCADES - 1 && linearDepth > ( csmx + csmy ) / 2.0 ) {
 
-			directionalLightShadow = directionalLightShadows[ i ];
-			float mult = all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;
+				directLight.color = mix( prevColor, directLight.color, ratio );
 
-			directLight.color = mix( directLight.color, directLight.color * mult, dist );
+			}
 
 		}
-        if(linearDepth >= CSM_cascades[ i ].x && (linearDepth < CSM_cascades[ i ].y ||  i  == CSM_CASCADES - 1)) {
 
+        if(linearDepth >= csmx && (linearDepth < csmy ||  i  == CSM_CASCADES - 1)) {
+
+			ReflectedLight prevLight = reflectedLight;
 			RE_Direct( directLight, geometry, material, reflectedLight );
 
+			if ( i != CSM_CASCADES - 1 || i == CSM_CASCADES - 1 && linearDepth < ( csmx + csmy ) / 2.0 ) {
+
+				reflectedLight.directDiffuse = mix( prevLight.directDiffuse, reflectedLight.directDiffuse, ratio );
+				reflectedLight.directSpecular = mix( prevLight.directSpecular, reflectedLight.directSpecular, ratio );
+				reflectedLight.indirectDiffuse = mix( prevLight.indirectDiffuse, reflectedLight.indirectDiffuse, ratio );
+				reflectedLight.indirectSpecular = mix( prevLight.indirectSpecular, reflectedLight.indirectSpecular, ratio );
+
+			}
+
 		}