Skip to content

Commit 3e64d3c

Browse files
committed
optimize WebXR render path
1 parent e07583b commit 3e64d3c

File tree

1 file changed

+48
-14
lines changed

1 file changed

+48
-14
lines changed

src/renderers/common/XRManager.js

Lines changed: 48 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import { AddEquation, BackSide, CustomBlending, DepthFormat, DepthStencilFormat,
1111
import { DepthTexture } from '../../textures/DepthTexture.js';
1212
import { XRRenderTarget } from './XRRenderTarget.js';
1313
import { CylinderGeometry } from '../../geometries/CylinderGeometry.js';
14+
import QuadMesh from './QuadMesh.js';
15+
import NodeMaterial from '../../materials/nodes/NodeMaterial.js';
1416
import { PlaneGeometry } from '../../geometries/PlaneGeometry.js';
1517
import { MeshBasicMaterial } from '../../materials/MeshBasicMaterial.js';
1618
import { 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

Comments
 (0)