فهرست منبع

Fix issues in WebXR caused by texture array work (#31099)

Rik Cabanier 10 ماه پیش
والد
کامیت
a4fb5e0cc2
4فایلهای تغییر یافته به همراه21 افزوده شده و 5 حذف شده
  1. 15 0
      src/renderers/common/Renderer.js
  2. 1 0
      src/renderers/common/Textures.js
  3. 3 4
      src/renderers/common/XRManager.js
  4. 2 1
      src/renderers/common/nodes/Nodes.js

+ 15 - 0
src/renderers/common/Renderer.js

@@ -2225,6 +2225,21 @@ class Renderer {
 
 
 	}
 	}
 
 
+	/**
+	 * Resets the renderer to the initial state before WebXR started.
+	 *
+	 */
+	XRResetState() {
+
+		this.backend.setXRTarget( null );
+		this.setOutputRenderTarget( null );
+		this.setRenderTarget( null );
+
+		this._frameBufferTarget.dispose();
+		this._frameBufferTarget = null;
+
+	}
+
 	/**
 	/**
 	 * Callback for {@link Renderer#setRenderObjectFunction}.
 	 * Callback for {@link Renderer#setRenderObjectFunction}.
 	 *
 	 *

+ 1 - 0
src/renderers/common/Textures.js

@@ -83,6 +83,7 @@ class Textures extends DataMap {
 			depthTexture.image.width = mipWidth;
 			depthTexture.image.width = mipWidth;
 			depthTexture.image.height = mipHeight;
 			depthTexture.image.height = mipHeight;
 			depthTexture.image.depth = size.depth;
 			depthTexture.image.depth = size.depth;
+			depthTexture.isArrayTexture = renderTarget.multiview === true && size.depth > 1;
 
 
 			depthTextureMips[ activeMipmapLevel ] = depthTexture;
 			depthTextureMips[ activeMipmapLevel ] = depthTexture;
 
 

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

@@ -1260,9 +1260,7 @@ function onSessionEnd() {
 
 
 	// restore framebuffer/rendering state
 	// restore framebuffer/rendering state
 
 
-	renderer.backend.setXRTarget( null );
-	renderer.setOutputRenderTarget( null );
-	renderer.setRenderTarget( null );
+	renderer.XRResetState();
 
 
 	this._session = null;
 	this._session = null;
 	this._xrRenderTarget = null;
 	this._xrRenderTarget = null;
@@ -1300,6 +1298,8 @@ function onSessionEnd() {
 
 
 			layer.plane.material = layer.material;
 			layer.plane.material = layer.material;
 			layer.material.map = layer.renderTarget.texture;
 			layer.material.map = layer.renderTarget.texture;
+			layer.material.map.offset.y = 1;
+			layer.material.map.repeat.y = - 1;
 			delete layer.xrlayer;
 			delete layer.xrlayer;
 
 
 		}
 		}
@@ -1312,7 +1312,6 @@ function onSessionEnd() {
 	this._useMultiview = false;
 	this._useMultiview = false;
 
 
 	renderer._animation.stop();
 	renderer._animation.stop();
-
 	renderer._animation.setAnimationLoop( this._currentAnimationLoop );
 	renderer._animation.setAnimationLoop( this._currentAnimationLoop );
 	renderer._animation.setContext( this._currentAnimationContext );
 	renderer._animation.setContext( this._currentAnimationContext );
 	renderer._animation.start();
 	renderer._animation.start();

+ 2 - 1
src/renderers/common/nodes/Nodes.js

@@ -202,7 +202,7 @@ class Nodes extends DataMap {
 				nodeBuilder.environmentNode = this.getEnvironmentNode( renderObject.scene );
 				nodeBuilder.environmentNode = this.getEnvironmentNode( renderObject.scene );
 				nodeBuilder.fogNode = this.getFogNode( renderObject.scene );
 				nodeBuilder.fogNode = this.getFogNode( renderObject.scene );
 				nodeBuilder.clippingContext = renderObject.clippingContext;
 				nodeBuilder.clippingContext = renderObject.clippingContext;
-				if ( this.renderer.getRenderTarget() ? this.renderer.getRenderTarget().multiview : false ) {
+				if ( this.renderer.getOutputRenderTarget() ? this.renderer.getOutputRenderTarget().multiview : false ) {
 
 
 					nodeBuilder.enableMultiview();
 					nodeBuilder.enableMultiview();
 
 
@@ -410,6 +410,7 @@ class Nodes extends DataMap {
 			if ( environmentNode ) _cacheKeyValues.push( environmentNode.getCacheKey() );
 			if ( environmentNode ) _cacheKeyValues.push( environmentNode.getCacheKey() );
 			if ( fogNode ) _cacheKeyValues.push( fogNode.getCacheKey() );
 			if ( fogNode ) _cacheKeyValues.push( fogNode.getCacheKey() );
 
 
+			_cacheKeyValues.push( this.renderer.getOutputRenderTarget() && this.renderer.getOutputRenderTarget().multiview ? 1 : 0 );
 			_cacheKeyValues.push( this.renderer.shadowMap.enabled ? 1 : 0 );
 			_cacheKeyValues.push( this.renderer.shadowMap.enabled ? 1 : 0 );
 
 
 			cacheKeyData.callId = callId;
 			cacheKeyData.callId = callId;

粤ICP备19079148号