Selaa lähdekoodia

ShadowNode: Ensure background does not influence shadow map. (#30170)

* ShadowNode: Ensure background does not influence shadow map.

* PostProcessingUtils: Fix `resetRendererAndSceneState()`.

* E2E: Update screenshot.

* Update webgpu_shadowmap_opacity.jpg

---------

Co-authored-by: sunag <sunagbrasil@gmail.com>
Michael Herzog 1 vuosi sitten
vanhempi
sitoutus
d3b07d6e07

BIN
examples/screenshots/webgpu_shadowmap_opacity.jpg


+ 7 - 12
src/nodes/lighting/ShadowNode.js

@@ -16,6 +16,7 @@ import { renderGroup } from '../core/UniformGroupNode.js';
 import { viewZToLogarithmicDepth } from '../display/ViewportDepthNode.js';
 import { viewZToLogarithmicDepth } from '../display/ViewportDepthNode.js';
 import { objectPosition } from '../accessors/Object3DNode.js';
 import { objectPosition } from '../accessors/Object3DNode.js';
 import { lightShadowMatrix } from '../accessors/Lights.js';
 import { lightShadowMatrix } from '../accessors/Lights.js';
+import { resetRendererAndSceneState, restoreRendererAndSceneState } from '../../renderers/common/PostProcessingUtils.js';
 
 
 /** @module ShadowNode **/
 /** @module ShadowNode **/
 
 
@@ -305,6 +306,7 @@ const _shadowFilterLib = [ BasicShadowFilter, PCFShadowFilter, PCFSoftShadowFilt
 
 
 //
 //
 
 
+let _rendererState;
 const _quadMesh = /*@__PURE__*/ new QuadMesh();
 const _quadMesh = /*@__PURE__*/ new QuadMesh();
 
 
 /**
 /**
@@ -652,19 +654,16 @@ class ShadowNode extends ShadowBaseNode {
 		const depthVersion = shadowMap.depthTexture.version;
 		const depthVersion = shadowMap.depthTexture.version;
 		this._depthVersionCached = depthVersion;
 		this._depthVersionCached = depthVersion;
 
 
-		const currentOverrideMaterial = scene.overrideMaterial;
-
-		scene.overrideMaterial = getShadowMaterial( light );
-
 		shadow.camera.layers.mask = camera.layers.mask;
 		shadow.camera.layers.mask = camera.layers.mask;
 
 
-		const currentRenderTarget = renderer.getRenderTarget();
 		const currentRenderObjectFunction = renderer.getRenderObjectFunction();
 		const currentRenderObjectFunction = renderer.getRenderObjectFunction();
-		const currentMRT = renderer.getMRT();
 
 
+		const currentMRT = renderer.getMRT();
 		const useVelocity = currentMRT ? currentMRT.has( 'velocity' ) : false;
 		const useVelocity = currentMRT ? currentMRT.has( 'velocity' ) : false;
 
 
-		renderer.setMRT( null );
+		_rendererState = resetRendererAndSceneState( renderer, scene, _rendererState );
+
+		scene.overrideMaterial = getShadowMaterial( light );
 
 
 		renderer.setRenderObjectFunction( ( object, scene, _camera, geometry, material, group, ...params ) => {
 		renderer.setRenderObjectFunction( ( object, scene, _camera, geometry, material, group, ...params ) => {
 
 
@@ -701,11 +700,7 @@ class ShadowNode extends ShadowBaseNode {
 
 
 		}
 		}
 
 
-		renderer.setRenderTarget( currentRenderTarget );
-
-		renderer.setMRT( currentMRT );
-
-		scene.overrideMaterial = currentOverrideMaterial;
+		restoreRendererAndSceneState( renderer, scene, _rendererState );
 
 
 	}
 	}
 
 

+ 32 - 8
src/renderers/common/PostProcessingUtils.js

@@ -50,11 +50,10 @@ export function restoreRendererState( renderer, state ) {
 
 
 }
 }
 
 
-// renderer and scene state
+// scene state
 
 
-export function saveRendererAndSceneState( renderer, scene, state = {} ) {
+export function saveSceneState( scene, state = {} ) {
 
 
-	state = saveRendererState( renderer, state );
 	state.background = scene.background;
 	state.background = scene.background;
 	state.backgroundNode = scene.backgroundNode;
 	state.backgroundNode = scene.backgroundNode;
 	state.overrideMaterial = scene.overrideMaterial;
 	state.overrideMaterial = scene.overrideMaterial;
@@ -63,9 +62,9 @@ export function saveRendererAndSceneState( renderer, scene, state = {} ) {
 
 
 }
 }
 
 
-export function resetRendererAndSceneState( renderer, scene, state ) {
+export function resetSceneState( scene, state ) {
 
 
-	state = saveRendererAndSceneState( renderer, scene, state );
+	state = saveSceneState( scene, state );
 
 
 	scene.background = null;
 	scene.background = null;
 	scene.backgroundNode = null;
 	scene.backgroundNode = null;
@@ -75,12 +74,37 @@ export function resetRendererAndSceneState( renderer, scene, state ) {
 
 
 }
 }
 
 
-export function restoreRendererAndSceneState( renderer, scene, state ) {
-
-	restoreRendererState( renderer, state );
+export function restoreSceneState( scene, state ) {
 
 
 	scene.background = state.background;
 	scene.background = state.background;
 	scene.backgroundNode = state.backgroundNode;
 	scene.backgroundNode = state.backgroundNode;
 	scene.overrideMaterial = state.overrideMaterial;
 	scene.overrideMaterial = state.overrideMaterial;
 
 
 }
 }
+
+// renderer and scene state
+
+export function saveRendererAndSceneState( renderer, scene, state = {} ) {
+
+	state = saveRendererState( renderer, state );
+	state = saveSceneState( scene, state );
+
+	return state;
+
+}
+
+export function resetRendererAndSceneState( renderer, scene, state ) {
+
+	state = resetRendererState( renderer, state );
+	state = resetSceneState( scene, state );
+
+	return state;
+
+}
+
+export function restoreRendererAndSceneState( renderer, scene, state ) {
+
+	restoreRendererState( renderer, state );
+	restoreSceneState( scene, state );
+
+}

粤ICP备19079148号