Просмотр исходного кода

XRManager: silence opaque framebuffer warning (#31201)

* silence opaque framebuffer warning

* address review comments
Rik Cabanier 7 месяцев назад
Родитель
Сommit
013cc18a6a

+ 1 - 1
src/renderers/common/Renderer.js

@@ -1260,7 +1260,7 @@ class Renderer {
 		frameBufferTarget.scissorTest = this._scissorTest;
 		frameBufferTarget.scissorTest = this._scissorTest;
 		frameBufferTarget.multiview = outputRenderTarget !== null ? outputRenderTarget.multiview : false;
 		frameBufferTarget.multiview = outputRenderTarget !== null ? outputRenderTarget.multiview : false;
 		frameBufferTarget.resolveDepthBuffer = outputRenderTarget !== null ? outputRenderTarget.resolveDepthBuffer : true;
 		frameBufferTarget.resolveDepthBuffer = outputRenderTarget !== null ? outputRenderTarget.resolveDepthBuffer : true;
-		frameBufferTarget.autoAllocateDepthBuffer = outputRenderTarget !== null ? outputRenderTarget.autoAllocateDepthBuffer : false;
+		frameBufferTarget._autoAllocateDepthBuffer = outputRenderTarget !== null ? outputRenderTarget._autoAllocateDepthBuffer : false;
 
 
 		return frameBufferTarget;
 		return frameBufferTarget;
 
 

+ 5 - 4
src/renderers/common/XRManager.js

@@ -641,7 +641,7 @@ class XRManager extends EventDispatcher {
 				resolveStencilBuffer: false
 				resolveStencilBuffer: false
 			} );
 			} );
 
 
-		renderTarget.autoAllocateDepthBuffer = true;
+		renderTarget._autoAllocateDepthBuffer = true;
 
 
 		const material = new MeshBasicMaterial( { color: 0xffffff, side: FrontSide } );
 		const material = new MeshBasicMaterial( { color: 0xffffff, side: FrontSide } );
 		material.map = renderTarget.texture;
 		material.map = renderTarget.texture;
@@ -732,7 +732,7 @@ class XRManager extends EventDispatcher {
 				resolveStencilBuffer: false
 				resolveStencilBuffer: false
 			} );
 			} );
 
 
-		renderTarget.autoAllocateDepthBuffer = true;
+		renderTarget._autoAllocateDepthBuffer = true;
 
 
 		const material = new MeshBasicMaterial( { color: 0xffffff, side: BackSide } );
 		const material = new MeshBasicMaterial( { color: 0xffffff, side: BackSide } );
 		material.map = renderTarget.texture;
 		material.map = renderTarget.texture;
@@ -806,7 +806,7 @@ class XRManager extends EventDispatcher {
 		for ( const layer of this._layers ) {
 		for ( const layer of this._layers ) {
 
 
 			layer.renderTarget.isXRRenderTarget = this._session !== null;
 			layer.renderTarget.isXRRenderTarget = this._session !== null;
-			layer.renderTarget.hasExternalTextures = layer.renderTarget.isXRRenderTarget;
+			layer.renderTarget._hasExternalTextures = layer.renderTarget.isXRRenderTarget;
 
 
 			if ( layer.renderTarget.isXRRenderTarget && this._supportsLayers ) {
 			if ( layer.renderTarget.isXRRenderTarget && this._supportsLayers ) {
 
 
@@ -974,7 +974,7 @@ class XRManager extends EventDispatcher {
 						multiview: this._useMultiview
 						multiview: this._useMultiview
 					} );
 					} );
 
 
-				this._xrRenderTarget.hasExternalTextures = true;
+				this._xrRenderTarget._hasExternalTextures = true;
 				this._xrRenderTarget.depth = this._useMultiview ? 2 : 1;
 				this._xrRenderTarget.depth = this._useMultiview ? 2 : 1;
 
 
 				this._supportsLayers = session.enabledFeatures.includes( 'layers' );
 				this._supportsLayers = session.enabledFeatures.includes( 'layers' );
@@ -1036,6 +1036,7 @@ class XRManager extends EventDispatcher {
 					}
 					}
 				);
 				);
 
 
+				this._xrRenderTarget._isOpaqueFramebuffer = true;
 				this._referenceSpace = await session.requestReferenceSpace( this.getReferenceSpaceType() );
 				this._referenceSpace = await session.requestReferenceSpace( this.getReferenceSpaceType() );
 
 
 			}
 			}

+ 18 - 4
src/renderers/common/XRRenderTarget.js

@@ -37,7 +37,7 @@ class XRRenderTarget extends RenderTarget {
 		 * @type {boolean}
 		 * @type {boolean}
 		 * @default false
 		 * @default false
 		 */
 		 */
-		this.hasExternalTextures = false;
+		this._hasExternalTextures = false;
 
 
 		/**
 		/**
 		 * Whether a depth buffer should automatically be allocated
 		 * Whether a depth buffer should automatically be allocated
@@ -53,7 +53,21 @@ class XRRenderTarget extends RenderTarget {
 		 * @type {boolean}
 		 * @type {boolean}
 		 * @default true
 		 * @default true
 		 */
 		 */
-		this.autoAllocateDepthBuffer = true;
+		this._autoAllocateDepthBuffer = true;
+
+
+		/**
+		 * Whether this render target is associated with a XRWebGLLayer.
+		 *
+		 * A XRWebGLLayer points to an opaque framebuffer. Basically,
+		 * this means that you don't have access to its bound color,
+		 * stencil and depth buffers. We need to handle this framebuffer
+		 * differently since its textures are always bound.
+		 *
+		 * @type {boolean}
+		 * @default false
+		 * */
+		this._isOpaqueFramebuffer = false;
 
 
 	}
 	}
 
 
@@ -61,8 +75,8 @@ class XRRenderTarget extends RenderTarget {
 
 
 		super.copy( source );
 		super.copy( source );
 
 
-		this.hasExternalTextures = source.hasExternalTextures;
-		this.autoAllocateDepthBuffer = source.autoAllocateDepthBuffer;
+		this._hasExternalTextures = source._hasExternalTextures;
+		this._autoAllocateDepthBuffer = source._autoAllocateDepthBuffer;
 
 
 		return this;
 		return this;
 
 

+ 9 - 9
src/renderers/webgl-fallback/WebGLBackend.js

@@ -364,13 +364,13 @@ class WebGLBackend extends Backend {
 
 
 			// The multisample_render_to_texture extension doesn't work properly if there
 			// The multisample_render_to_texture extension doesn't work properly if there
 			// are midframe flushes and an external depth texture.
 			// are midframe flushes and an external depth texture.
-			if ( ( this.extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true ) && renderTarget.autoAllocateDepthBuffer === true && renderTarget.multiview === false ) {
+			if ( ( this.extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true ) && renderTarget._autoAllocateDepthBuffer === true && renderTarget.multiview === false ) {
 
 
 				console.warn( 'THREE.WebGLBackend: Render-to-texture extension was disabled because an external texture was provided' );
 				console.warn( 'THREE.WebGLBackend: Render-to-texture extension was disabled because an external texture was provided' );
 
 
 			}
 			}
 
 
-			renderTarget.autoAllocateDepthBuffer = false;
+			renderTarget._autoAllocateDepthBuffer = false;
 
 
 		}
 		}
 
 
@@ -2002,7 +2002,7 @@ class WebGLBackend extends Backend {
 			const isRenderTarget3D = renderTarget.isRenderTarget3D === true;
 			const isRenderTarget3D = renderTarget.isRenderTarget3D === true;
 			const isRenderTargetArray = renderTarget.depth > 1;
 			const isRenderTargetArray = renderTarget.depth > 1;
 			const isXRRenderTarget = renderTarget.isXRRenderTarget === true;
 			const isXRRenderTarget = renderTarget.isXRRenderTarget === true;
-			const hasExternalTextures = ( isXRRenderTarget === true && renderTarget.hasExternalTextures === true );
+			const _hasExternalTextures = ( isXRRenderTarget === true && renderTarget._hasExternalTextures === true );
 
 
 			let msaaFb = renderTargetContextData.msaaFrameBuffer;
 			let msaaFb = renderTargetContextData.msaaFrameBuffer;
 			let depthRenderbuffer = renderTargetContextData.depthRenderbuffer;
 			let depthRenderbuffer = renderTargetContextData.depthRenderbuffer;
@@ -2019,7 +2019,7 @@ class WebGLBackend extends Backend {
 
 
 				fb = renderTargetContextData.cubeFramebuffers[ cacheKey ];
 				fb = renderTargetContextData.cubeFramebuffers[ cacheKey ];
 
 
-			} else if ( isXRRenderTarget && hasExternalTextures === false ) {
+			} else if ( isXRRenderTarget && _hasExternalTextures === false ) {
 
 
 				fb = this._xrFramebuffer;
 				fb = this._xrFramebuffer;
 
 
@@ -2095,7 +2095,7 @@ class WebGLBackend extends Backend {
 
 
 				const depthStyle = stencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT;
 				const depthStyle = stencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT;
 
 
-				if ( renderTarget.autoAllocateDepthBuffer === true ) {
+				if ( renderTarget._autoAllocateDepthBuffer === true ) {
 
 
 					const renderbuffer = gl.createRenderbuffer();
 					const renderbuffer = gl.createRenderbuffer();
 					this.textureUtils.setupRenderBufferStorage( renderbuffer, descriptor, 0, useMultisampledRTT );
 					this.textureUtils.setupRenderBufferStorage( renderbuffer, descriptor, 0, useMultisampledRTT );
@@ -2120,7 +2120,7 @@ class WebGLBackend extends Backend {
 
 
 							multiviewExt.framebufferTextureMultisampleMultiviewOVR( gl.FRAMEBUFFER, depthStyle, textureData.textureGPU, 0, samples, 0, 2 );
 							multiviewExt.framebufferTextureMultisampleMultiviewOVR( gl.FRAMEBUFFER, depthStyle, textureData.textureGPU, 0, samples, 0, 2 );
 
 
-						} else if ( hasExternalTextures && useMultisampledRTT ) {
+						} else if ( _hasExternalTextures && useMultisampledRTT ) {
 
 
 							multisampledRTTExt.framebufferTexture2DMultisampleEXT( gl.FRAMEBUFFER, depthStyle, gl.TEXTURE_2D, textureData.textureGPU, 0, samples );
 							multisampledRTTExt.framebufferTexture2DMultisampleEXT( gl.FRAMEBUFFER, depthStyle, gl.TEXTURE_2D, textureData.textureGPU, 0, samples );
 
 
@@ -2171,7 +2171,7 @@ class WebGLBackend extends Backend {
 
 
 				// rebind external XR textures
 				// rebind external XR textures
 
 
-				if ( isXRRenderTarget || useMultisampledRTT || renderTarget.multiview ) {
+				if ( ( isXRRenderTarget || useMultisampledRTT || renderTarget.multiview ) && ( renderTarget._isOpaqueFramebuffer !== true ) ) {
 
 
 					state.bindFramebuffer( gl.FRAMEBUFFER, fb );
 					state.bindFramebuffer( gl.FRAMEBUFFER, fb );
 
 
@@ -2197,7 +2197,7 @@ class WebGLBackend extends Backend {
 
 
 					const depthStyle = stencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT;
 					const depthStyle = stencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT;
 
 
-					if ( renderTarget.autoAllocateDepthBuffer === true ) {
+					if ( renderTarget._autoAllocateDepthBuffer === true ) {
 
 
 						const renderbuffer = renderTargetContextData.xrDepthRenderbuffer;
 						const renderbuffer = renderTargetContextData.xrDepthRenderbuffer;
 						gl.bindRenderbuffer( gl.RENDERBUFFER, renderbuffer );
 						gl.bindRenderbuffer( gl.RENDERBUFFER, renderbuffer );
@@ -2528,7 +2528,7 @@ class WebGLBackend extends Backend {
 
 
 		}
 		}
 
 
-		return renderTarget.samples > 0 && this.extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true && renderTarget.autoAllocateDepthBuffer !== false;
+		return renderTarget.samples > 0 && this.extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true && renderTarget._autoAllocateDepthBuffer !== false;
 
 
 	}
 	}
 
 

粤ICP备19079148号