@@ -11,6 +11,8 @@ import { AddEquation, BackSide, CustomBlending, DepthFormat, DepthStencilFormat,
1111import { DepthTexture } from '../../textures/DepthTexture.js' ;
1212import { XRRenderTarget } from './XRRenderTarget.js' ;
1313import { CylinderGeometry } from '../../geometries/CylinderGeometry.js' ;
14+ import QuadMesh from './QuadMesh.js' ;
15+ import NodeMaterial from '../../materials/nodes/NodeMaterial.js' ;
1416import { PlaneGeometry } from '../../geometries/PlaneGeometry.js' ;
1517import { MeshBasicMaterial } from '../../materials/MeshBasicMaterial.js' ;
1618import { Mesh } from '../../objects/Mesh.js' ;
@@ -169,6 +171,8 @@ class XRManager extends EventDispatcher {
169171 */
170172 this . _supportsLayers = false ;
171173
174+ this . _frameBufferTargets = null ;
175+
172176 /**
173177 * Helper function to create native WebXR Layer.
174178 *
@@ -788,12 +792,17 @@ class XRManager extends EventDispatcher {
788792
789793 const translationObject = new Vector3 ( ) ;
790794 const quaternionObject = new Quaternion ( ) ;
795+ const renderer = this . _renderer ;
791796
792797 const wasPresenting = this . isPresenting ;
793- const rendererOutputTarget = this . _renderer . getOutputRenderTarget ( ) ;
794- const rendererFramebufferTarget = this . _renderer . _frameBufferTarget ;
798+ const rendererOutputTarget = renderer . getOutputRenderTarget ( ) ;
799+ const rendererFramebufferTarget = renderer . _frameBufferTarget ;
795800 this . isPresenting = false ;
796801
802+ const rendererSize = new Vector2 ( ) ;
803+ renderer . getSize ( rendererSize ) ;
804+ const rendererQuad = renderer . _quad ;
805+
797806 for ( const layer of this . _layers ) {
798807
799808 layer . renderTarget . isXRRenderTarget = this . _session !== null ;
@@ -804,28 +813,50 @@ class XRManager extends EventDispatcher {
804813 layer . xrlayer . transform = new XRRigidTransform ( layer . plane . getWorldPosition ( translationObject ) , layer . plane . getWorldQuaternion ( quaternionObject ) ) ;
805814
806815 const glSubImage = this . _glBinding . getSubImage ( layer . xrlayer , this . _xrFrame ) ;
807- this . _renderer . backend . setXRRenderTargetTextures (
816+ renderer . backend . setXRRenderTargetTextures (
808817 layer . renderTarget ,
809818 glSubImage . colorTexture ,
810819 undefined ) ;
811820
812- this . _renderer . setOutputRenderTarget ( layer . renderTarget ) ;
813- this . _renderer . setRenderTarget ( null ) ;
821+
822+ renderer . setOutputRenderTarget ( layer . renderTarget ) ;
823+ renderer . setRenderTarget ( null ) ;
824+ renderer . _frameBufferTarget = null ;
825+ renderer . setSize ( layer . renderTarget . width , layer . renderTarget . height , false ) ;
826+
827+ this . _frameBufferTargets || ( this . _frameBufferTargets = new WeakMap ( ) ) ;
828+ const { frameBufferTarget, quad } = this . _frameBufferTargets . get ( layer . renderTarget ) || { frameBufferTarget : null , quad : null } ;
829+ if ( ! frameBufferTarget ) {
830+
831+ renderer . _quad = new QuadMesh ( new NodeMaterial ( ) ) ;
832+ this . _frameBufferTargets . set ( layer . renderTarget , { frameBufferTarget : renderer . _getFrameBufferTarget ( ) , quad : renderer . _quad } ) ;
833+
834+ } else {
835+
836+ renderer . _frameBufferTarget = frameBufferTarget ;
837+ renderer . _quad = quad ;
838+
839+ }
840+
841+ layer . rendercall ( ) ;
842+
843+ renderer . _frameBufferTarget = null ;
814844
815845 } else {
816846
817- this . _renderer . setRenderTarget ( layer . renderTarget ) ;
847+ renderer . setRenderTarget ( layer . renderTarget ) ;
848+ layer . rendercall ( ) ;
818849
819850 }
820851
821- layer . rendercall ( ) ;
822-
823852 }
824853
854+ renderer . setRenderTarget ( null ) ;
855+ renderer . setOutputRenderTarget ( rendererOutputTarget ) ;
856+ renderer . _frameBufferTarget = rendererFramebufferTarget ;
857+ renderer . setSize ( rendererSize . x , rendererSize . y , false ) ;
858+ renderer . _quad = rendererQuad ;
825859 this . isPresenting = wasPresenting ;
826- this . _renderer . setRenderTarget ( null ) ;
827- this . _renderer . setOutputRenderTarget ( rendererOutputTarget ) ;
828- this . _renderer . _frameBufferTarget = rendererFramebufferTarget ;
829860
830861 }
831862
@@ -904,7 +935,8 @@ class XRManager extends EventDispatcher {
904935 const projectionlayerInit = {
905936 colorFormat : gl . RGBA8 ,
906937 depthFormat : glDepthFormat ,
907- scaleFactor : this . _framebufferScaleFactor
938+ scaleFactor : this . _framebufferScaleFactor ,
939+ clearOnAccess : false
908940 } ;
909941
910942 if ( this . _useMultiviewIfPossible && renderer . hasFeature ( 'OVR_multiview2' ) ) {
@@ -1453,7 +1485,8 @@ function createXRLayer( layer ) {
14531485 height : layer . height / 2 ,
14541486 space : this . _referenceSpace ,
14551487 viewPixelWidth : layer . pixelwidth ,
1456- viewPixelHeight : layer . pixelheight
1488+ viewPixelHeight : layer . pixelheight ,
1489+ clearOnAccess : false
14571490 } ) ;
14581491
14591492 } else {
@@ -1465,7 +1498,8 @@ function createXRLayer( layer ) {
14651498 aspectRatio : layer . aspectRatio ,
14661499 space : this . _referenceSpace ,
14671500 viewPixelWidth : layer . pixelwidth ,
1468- viewPixelHeight : layer . pixelheight
1501+ viewPixelHeight : layer . pixelheight ,
1502+ clearOnAccess : false
14691503 } ) ;
14701504
14711505 }
0 commit comments