@@ -38,6 +38,7 @@ import { WebGLGeometries } from './webgl/WebGLGeometries.js';
3838import { WebGLIndexedBufferRenderer } from './webgl/WebGLIndexedBufferRenderer.js' ;
3939import { WebGLInfo } from './webgl/WebGLInfo.js' ;
4040import { WebGLMorphtargets } from './webgl/WebGLMorphtargets.js' ;
41+ import { WebGLMultiview } from './webgl/WebGLMultiview.js' ;
4142import { WebGLObjects } from './webgl/WebGLObjects.js' ;
4243import { WebGLPrograms } from './webgl/WebGLPrograms.js' ;
4344import { WebGLProperties } from './webgl/WebGLProperties.js' ;
@@ -82,6 +83,7 @@ class WebGLRenderer {
8283 powerPreference = 'default' ,
8384 failIfMajorPerformanceCaveat = false ,
8485 reversedDepthBuffer = false ,
86+ multiviewStereo = false ,
8587 } = parameters ;
8688
8789 /**
@@ -408,6 +410,7 @@ class WebGLRenderer {
408410 let extensions , capabilities , state , info ;
409411 let properties , textures , cubemaps , cubeuvmaps , attributes , geometries , objects ;
410412 let programCache , materials , renderLists , renderStates , clipping , shadowMap ;
413+ let multiview ;
411414
412415 let background , morphtargets , bufferRenderer , indexedBufferRenderer ;
413416
@@ -446,6 +449,7 @@ class WebGLRenderer {
446449 renderLists = new WebGLRenderLists ( ) ;
447450 renderStates = new WebGLRenderStates ( extensions ) ;
448451 background = new WebGLBackground ( _this , cubemaps , cubeuvmaps , state , objects , _alpha , premultipliedAlpha ) ;
452+ multiview = new WebGLMultiview ( _this , extensions , _gl ) ;
449453 shadowMap = new WebGLShadowMap ( _this , objects , capabilities ) ;
450454 uniformsGroups = new WebGLUniformsGroups ( _gl , info , capabilities , state ) ;
451455
@@ -535,7 +539,7 @@ class WebGLRenderer {
535539
536540 // xr
537541
538- const xr = new WebXRManager ( _this , _gl ) ;
542+ const xr = new WebXRManager ( _this , _gl , extensions , multiviewStereo ) ;
539543
540544 /**
541545 * A reference to the XR manager.
@@ -1652,11 +1656,21 @@ class WebGLRenderer {
16521656
16531657 if ( _renderBackground ) background . render ( scene ) ;
16541658
1655- for ( let i = 0 , l = cameras . length ; i < l ; i ++ ) {
1659+ if ( xr . enabled && xr . isMultiview ) {
16561660
1657- const camera2 = cameras [ i ] ;
1661+ textures . setDeferTextureUploads ( true ) ;
16581662
1659- renderScene ( currentRenderList , scene , camera2 , camera2 . viewport ) ;
1663+ renderScene ( currentRenderList , scene , camera , camera . cameras [ 0 ] . viewport ) ;
1664+
1665+ } else {
1666+
1667+ for ( let i = 0 , l = cameras . length ; i < l ; i ++ ) {
1668+
1669+ const camera2 = cameras [ i ] ;
1670+
1671+ renderScene ( currentRenderList , scene , camera2 , camera2 . viewport ) ;
1672+
1673+ }
16601674
16611675 }
16621676
@@ -1688,6 +1702,8 @@ class WebGLRenderer {
16881702
16891703 if ( scene . isScene === true ) scene . onAfterRender ( _this , scene , camera ) ;
16901704
1705+ textures . runDeferredUploads ( ) ;
1706+
16911707 // _gl.finish();
16921708
16931709 bindingStates . resetDefaultState ( ) ;
@@ -2184,6 +2200,7 @@ class WebGLRenderer {
21842200 materialProperties . vertexAlphas = parameters . vertexAlphas ;
21852201 materialProperties . vertexTangents = parameters . vertexTangents ;
21862202 materialProperties . toneMapping = parameters . toneMapping ;
2203+ materialProperties . numMultiviewViews = parameters . numMultiviewViews ;
21872204
21882205 }
21892206
@@ -2215,6 +2232,8 @@ class WebGLRenderer {
22152232
22162233 }
22172234
2235+ const numMultiviewViews = _currentRenderTarget && _currentRenderTarget . isWebGLMultiviewRenderTarget ? _currentRenderTarget . numViews : 0 ;
2236+
22182237 const morphAttribute = geometry . morphAttributes . position || geometry . morphAttributes . normal || geometry . morphAttributes . color ;
22192238 const morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute . length : 0 ;
22202239
@@ -2342,6 +2361,10 @@ class WebGLRenderer {
23422361
23432362 needsProgramChange = true ;
23442363
2364+ } else if ( materialProperties . numMultiviewViews !== numMultiviewViews ) {
2365+
2366+ needsProgramChange = true ;
2367+
23452368 }
23462369
23472370 } else {
@@ -2388,18 +2411,27 @@ class WebGLRenderer {
23882411
23892412 // common camera uniforms
23902413
2391- const reversedDepthBuffer = state . buffers . depth . getReversed ( ) ;
2414+ if ( program . numMultiviewViews > 0 ) {
23922415
2393- if ( reversedDepthBuffer && camera . reversedDepth !== true ) {
2416+ multiview . updateCameraProjectionMatricesUniform ( camera , p_uniforms ) ;
2417+ multiview . updateCameraViewMatricesUniform ( camera , p_uniforms ) ;
23942418
2395- camera . _reversedDepth = true ;
2396- camera . updateProjectionMatrix ( ) ;
2419+ } else {
23972420
2398- }
2421+ const reversedDepthBuffer = state . buffers . depth . getReversed ( ) ;
2422+
2423+ if ( reversedDepthBuffer && camera . reversedDepth !== true ) {
23992424
2400- p_uniforms . setValue ( _gl , 'projectionMatrix' , camera . projectionMatrix ) ;
2425+ camera . _reversedDepth = true ;
2426+ camera . updateProjectionMatrix ( ) ;
2427+
2428+ }
24012429
2402- p_uniforms . setValue ( _gl , 'viewMatrix' , camera . matrixWorldInverse ) ;
2430+ p_uniforms . setValue ( _gl , 'projectionMatrix' , camera . projectionMatrix ) ;
2431+
2432+ p_uniforms . setValue ( _gl , 'viewMatrix' , camera . matrixWorldInverse ) ;
2433+
2434+ }
24032435
24042436 const uCamPos = p_uniforms . map . cameraPosition ;
24052437
@@ -2568,8 +2600,17 @@ class WebGLRenderer {
25682600
25692601 // common matrices
25702602
2571- p_uniforms . setValue ( _gl , 'modelViewMatrix' , object . modelViewMatrix ) ;
2572- p_uniforms . setValue ( _gl , 'normalMatrix' , object . normalMatrix ) ;
2603+ if ( program . numMultiviewViews > 0 ) {
2604+
2605+ multiview . updateObjectMatricesUniforms ( object , camera , p_uniforms ) ;
2606+
2607+ } else {
2608+
2609+ p_uniforms . setValue ( _gl , 'modelViewMatrix' , object . modelViewMatrix ) ;
2610+ p_uniforms . setValue ( _gl , 'normalMatrix' , object . normalMatrix ) ;
2611+
2612+ }
2613+
25732614 p_uniforms . setValue ( _gl , 'modelMatrix' , object . matrixWorld ) ;
25742615
25752616 // UBOs
@@ -2684,7 +2725,7 @@ class WebGLRenderer {
26842725 const renderTargetProperties = properties . get ( renderTarget ) ;
26852726
26862727 renderTargetProperties . __autoAllocateDepthBuffer = renderTarget . resolveDepthBuffer === false ;
2687- if ( renderTargetProperties . __autoAllocateDepthBuffer === false ) {
2728+ if ( ! renderTargetProperties . __autoAllocateDepthBuffer ) {
26882729
26892730 // The multisample_render_to_texture extension doesn't work properly if there
26902731 // are midframe flushes and an external depth buffer. Disable use of the extension.
0 commit comments