@@ -11,6 +11,8 @@ import { AddEquation, BackSide, CustomBlending, DepthFormat, DepthStencilFormat,
11
11
import { DepthTexture } from '../../textures/DepthTexture.js' ;
12
12
import { XRRenderTarget } from './XRRenderTarget.js' ;
13
13
import { CylinderGeometry } from '../../geometries/CylinderGeometry.js' ;
14
+ import QuadMesh from './QuadMesh.js' ;
15
+ import NodeMaterial from '../../materials/nodes/NodeMaterial.js' ;
14
16
import { PlaneGeometry } from '../../geometries/PlaneGeometry.js' ;
15
17
import { MeshBasicMaterial } from '../../materials/MeshBasicMaterial.js' ;
16
18
import { Mesh } from '../../objects/Mesh.js' ;
@@ -169,6 +171,8 @@ class XRManager extends EventDispatcher {
169
171
*/
170
172
this . _supportsLayers = false ;
171
173
174
+ this . _frameBufferTargets = null ;
175
+
172
176
/**
173
177
* Helper function to create native WebXR Layer.
174
178
*
@@ -788,12 +792,17 @@ class XRManager extends EventDispatcher {
788
792
789
793
const translationObject = new Vector3 ( ) ;
790
794
const quaternionObject = new Quaternion ( ) ;
795
+ const renderer = this . _renderer ;
791
796
792
797
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 ;
795
800
this . isPresenting = false ;
796
801
802
+ const rendererSize = new Vector2 ( ) ;
803
+ renderer . getSize ( rendererSize ) ;
804
+ const rendererQuad = renderer . _quad ;
805
+
797
806
for ( const layer of this . _layers ) {
798
807
799
808
layer . renderTarget . isXRRenderTarget = this . _session !== null ;
@@ -804,28 +813,50 @@ class XRManager extends EventDispatcher {
804
813
layer . xrlayer . transform = new XRRigidTransform ( layer . plane . getWorldPosition ( translationObject ) , layer . plane . getWorldQuaternion ( quaternionObject ) ) ;
805
814
806
815
const glSubImage = this . _glBinding . getSubImage ( layer . xrlayer , this . _xrFrame ) ;
807
- this . _renderer . backend . setXRRenderTargetTextures (
816
+ renderer . backend . setXRRenderTargetTextures (
808
817
layer . renderTarget ,
809
818
glSubImage . colorTexture ,
810
819
undefined ) ;
811
820
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 ;
814
844
815
845
} else {
816
846
817
- this . _renderer . setRenderTarget ( layer . renderTarget ) ;
847
+ renderer . setRenderTarget ( layer . renderTarget ) ;
848
+ layer . rendercall ( ) ;
818
849
819
850
}
820
851
821
- layer . rendercall ( ) ;
822
-
823
852
}
824
853
854
+ renderer . setRenderTarget ( null ) ;
855
+ renderer . setOutputRenderTarget ( rendererOutputTarget ) ;
856
+ renderer . _frameBufferTarget = rendererFramebufferTarget ;
857
+ renderer . setSize ( rendererSize . x , rendererSize . y , false ) ;
858
+ renderer . _quad = rendererQuad ;
825
859
this . isPresenting = wasPresenting ;
826
- this . _renderer . setRenderTarget ( null ) ;
827
- this . _renderer . setOutputRenderTarget ( rendererOutputTarget ) ;
828
- this . _renderer . _frameBufferTarget = rendererFramebufferTarget ;
829
860
830
861
}
831
862
@@ -904,7 +935,8 @@ class XRManager extends EventDispatcher {
904
935
const projectionlayerInit = {
905
936
colorFormat : gl . RGBA8 ,
906
937
depthFormat : glDepthFormat ,
907
- scaleFactor : this . _framebufferScaleFactor
938
+ scaleFactor : this . _framebufferScaleFactor ,
939
+ clearOnAccess : false
908
940
} ;
909
941
910
942
if ( this . _useMultiviewIfPossible && renderer . hasFeature ( 'OVR_multiview2' ) ) {
@@ -1453,7 +1485,8 @@ function createXRLayer( layer ) {
1453
1485
height : layer . height / 2 ,
1454
1486
space : this . _referenceSpace ,
1455
1487
viewPixelWidth : layer . pixelwidth ,
1456
- viewPixelHeight : layer . pixelheight
1488
+ viewPixelHeight : layer . pixelheight ,
1489
+ clearOnAccess : false
1457
1490
} ) ;
1458
1491
1459
1492
} else {
@@ -1465,7 +1498,8 @@ function createXRLayer( layer ) {
1465
1498
aspectRatio : layer . aspectRatio ,
1466
1499
space : this . _referenceSpace ,
1467
1500
viewPixelWidth : layer . pixelwidth ,
1468
- viewPixelHeight : layer . pixelheight
1501
+ viewPixelHeight : layer . pixelheight ,
1502
+ clearOnAccess : false
1469
1503
} ) ;
1470
1504
1471
1505
}
0 commit comments