1
0
Эх сурвалжийг харах

WebGPURenderer: Ensure render targets have consistent default depth values. (#33191)

Michael Herzog 1 сар өмнө
parent
commit
ceeebefeee

+ 26 - 2
src/renderers/common/Renderer.js

@@ -1465,6 +1465,28 @@ class Renderer {
 
 
 		}
 		}
 
 
+		// make sure a new render target has correct default depth values
+
+		if ( renderTarget !== null && renderTarget.depthBuffer === true ) {
+
+			const renderTargetData = this._textures.get( renderTarget );
+
+			if ( renderTargetData.depthInitialized !== true ) {
+
+				// we need a single manual clear if auto clear depth is disabled
+
+				if ( this.autoClear === false || ( this.autoClear === true && this.autoClearDepth === false ) ) {
+
+					this.clearDepth();
+
+				}
+
+				renderTargetData.depthInitialized = true;
+
+			}
+
+		}
+
 		//
 		//
 
 
 		const renderContext = this._renderContexts.get( renderTarget, this._mrt, this._callDepth );
 		const renderContext = this._renderContexts.get( renderTarget, this._mrt, this._callDepth );
@@ -2198,7 +2220,7 @@ class Renderer {
 
 
 			const renderTargetData = this._textures.get( renderTarget );
 			const renderTargetData = this._textures.get( renderTarget );
 
 
-			renderContext = this._renderContexts.get( renderTarget );
+			renderContext = this._renderContexts.get( renderTarget, null, - 1 ); // using - 1 for the call depth to get a render context for the clear operation
 			renderContext.textures = renderTargetData.textures;
 			renderContext.textures = renderTargetData.textures;
 			renderContext.depthTexture = renderTargetData.depthTexture;
 			renderContext.depthTexture = renderTargetData.depthTexture;
 			renderContext.width = renderTargetData.width;
 			renderContext.width = renderTargetData.width;
@@ -2217,6 +2239,8 @@ class Renderer {
 			renderContext.activeCubeFace = this.getActiveCubeFace();
 			renderContext.activeCubeFace = this.getActiveCubeFace();
 			renderContext.activeMipmapLevel = this.getActiveMipmapLevel();
 			renderContext.activeMipmapLevel = this.getActiveMipmapLevel();
 
 
+			if ( renderTarget.depthBuffer === true ) renderTargetData.depthInitialized = true;
+
 		}
 		}
 
 
 		this.backend.clear( color, depth, stencil, renderContext );
 		this.backend.clear( color, depth, stencil, renderContext );
@@ -2480,7 +2504,7 @@ class Renderer {
 	/**
 	/**
 	 * Sets the output render target for the renderer.
 	 * Sets the output render target for the renderer.
 	 *
 	 *
-	 * @param {Object} renderTarget - The render target to set as the output target.
+	 * @param {?RenderTarget} renderTarget - The render target to set as the output target.
 	 */
 	 */
 	setOutputRenderTarget( renderTarget ) {
 	setOutputRenderTarget( renderTarget ) {
 
 

粤ICP备19079148号