diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js index 958eff244e5d8f8d9296e63bb3cb4fbc95728f38..80c08b2c8ffc405b91c65eea0d02d5284690fd1e 100644 --- a/src/renderers/WebGLRenderer.js +++ b/src/renderers/WebGLRenderer.js @@ -1197,7 +1197,7 @@ function WebGLRenderer( parameters ) { } - if ( capabilities.multiview ) { + if ( camera.isArrayCamera && multiview.isAvailable() ) { multiview.attachCamera( camera ); @@ -1257,7 +1257,7 @@ function WebGLRenderer( parameters ) { state.setPolygonOffset( false ); - if ( capabilities.multiview ) { + if ( camera.isArrayCamera && multiview.isAvailable() ) { multiview.detachCamera( camera ); @@ -1416,9 +1416,9 @@ function WebGLRenderer( parameters ) { _currentArrayCamera = camera; - if ( capabilities.multiview ) { + if ( multiview.isAvailable() ) { - renderObject( object, scene, camera, geometry, material, group ); + renderObject( object, scene, camera, geometry, material, group ); } else { diff --git a/src/renderers/webgl/WebGLCapabilities.js b/src/renderers/webgl/WebGLCapabilities.js index 9e0b045f0d7203048b94e87b75add979c7ebbb51..4eafd2132f9ce2ed650c59fbc35611190a4c0bdd 100644 --- a/src/renderers/webgl/WebGLCapabilities.js +++ b/src/renderers/webgl/WebGLCapabilities.js @@ -86,10 +86,6 @@ function WebGLCapabilities( gl, extensions, parameters ) { var maxSamples = isWebGL2 ? gl.getParameter( gl.MAX_SAMPLES ) : 0; - var multiviewExt = extensions.get( 'OVR_multiview2' ); - var multiview = isWebGL2 && !! multiviewExt && ! gl.getContextAttributes().antialias; - var maxMultiviewViews = multiview ? gl.getParameter( multiviewExt.MAX_VIEWS_OVR ) : 0; - return { isWebGL2: isWebGL2, @@ -114,10 +110,7 @@ function WebGLCapabilities( gl, extensions, parameters ) { floatFragmentTextures: floatFragmentTextures, floatVertexTextures: floatVertexTextures, - maxSamples: maxSamples, - - multiview: multiview, - maxMultiviewViews: maxMultiviewViews + maxSamples: maxSamples }; diff --git a/src/renderers/webgl/WebGLMultiview.js b/src/renderers/webgl/WebGLMultiview.js index a8b78d4ffb19a4757c6aae6dbd717486d2345996..0fc7a14ca71275df4cef53b8e4448667b28e75ae 100644 --- a/src/renderers/webgl/WebGLMultiview.js +++ b/src/renderers/webgl/WebGLMultiview.js @@ -13,28 +13,54 @@ function WebGLMultiview( renderer, gl ) { var DEFAULT_NUMVIEWS = 2; var capabilities = renderer.capabilities; + var extensions = renderer.extensions; var properties = renderer.properties; - var maxNumViews = capabilities.maxMultiviewViews; - var renderTarget, currentRenderTarget; - var mat3, mat4, cameraArray, renderSize; + var mat3, mat4, renderSize; - function getCameraArray( camera ) { + var available; + var maxNumViews = 0; - if ( camera.isArrayCamera ) return camera.cameras; + // - cameraArray[ 0 ] = camera; + function isAvailable() { - return cameraArray; + if ( available === undefined ) { - } + var extension = extensions.get( 'OVR_multiview2' ); - // + available = extension !== null && gl.getContextAttributes().antialias === false; + + if ( available ) { + + maxNumViews = gl.getParameter( extension.MAX_VIEWS_OVR ); + renderTarget = new WebGLMultiviewRenderTarget( 0, 0, DEFAULT_NUMVIEWS ); + + renderSize = new Vector2(); + mat4 = []; + mat3 = []; + + var maxViews = capabilities.maxMultiviewViews; + + for ( var i = 0; i < maxViews; i ++ ) { + + mat4[ i ] = new Matrix4(); + mat3[ i ] = new Matrix3(); + + } + + } + + } + + return available; + + } function updateCameraProjectionMatricesUniform( camera, uniforms ) { - var cameras = getCameraArray( camera ); + var cameras = camera.cameras; for ( var i = 0; i < cameras.length; i ++ ) { @@ -48,7 +74,7 @@ function WebGLMultiview( renderer, gl ) { function updateCameraViewMatricesUniform( camera, uniforms ) { - var cameras = getCameraArray( camera ); + var cameras = camera.cameras; for ( var i = 0; i < cameras.length; i ++ ) { @@ -62,7 +88,7 @@ function WebGLMultiview( renderer, gl ) { function updateObjectMatricesUniforms( object, camera, uniforms ) { - var cameras = getCameraArray( camera ); + var cameras = camera.cameras; for ( var i = 0; i < cameras.length; i ++ ) { @@ -78,8 +104,6 @@ function WebGLMultiview( renderer, gl ) { function isMultiviewCompatible( camera ) { - if ( ! camera.isArrayCamera ) return true; - var cameras = camera.cameras; if ( cameras.length > maxNumViews ) return false; @@ -107,20 +131,10 @@ function WebGLMultiview( renderer, gl ) { } - if ( camera.isArrayCamera ) { - - var viewport = camera.cameras[ 0 ].viewport; - - renderTarget.setSize( viewport.z, viewport.w ); + var viewport = camera.cameras[ 0 ].viewport; - renderTarget.setNumViews( camera.cameras.length ); - - } else { - - renderTarget.setSize( renderSize.x, renderSize.y ); - renderTarget.setNumViews( DEFAULT_NUMVIEWS ); - - } + renderTarget.setSize( viewport.z, viewport.w ); + renderTarget.setNumViews( camera.cameras.length ); } @@ -139,6 +153,7 @@ function WebGLMultiview( renderer, gl ) { if ( renderTarget !== renderer.getRenderTarget() ) return; renderer.setRenderTarget( currentRenderTarget ); + flush( camera ); } @@ -153,53 +168,23 @@ function WebGLMultiview( renderer, gl ) { var viewWidth = srcRenderTarget.width; var viewHeight = srcRenderTarget.height; - if ( camera.isArrayCamera ) { - - for ( var i = 0; i < numViews; i ++ ) { - - var viewport = camera.cameras[ i ].viewport; - - var x1 = viewport.x; - var y1 = viewport.y; - var x2 = x1 + viewport.z; - var y2 = y1 + viewport.w; - - gl.bindFramebuffer( gl.READ_FRAMEBUFFER, srcFramebuffers[ i ] ); - gl.blitFramebuffer( 0, 0, viewWidth, viewHeight, x1, y1, x2, y2, gl.COLOR_BUFFER_BIT, gl.NEAREST ); - - } - - } else { - - gl.bindFramebuffer( gl.READ_FRAMEBUFFER, srcFramebuffers[ 0 ] ); - gl.blitFramebuffer( 0, 0, viewWidth, viewHeight, 0, 0, renderSize.x, renderSize.y, gl.COLOR_BUFFER_BIT, gl.NEAREST ); - - } - - } - - - if ( renderer.capabilities.multiview ) { + for ( var i = 0; i < numViews; i ++ ) { - renderTarget = new WebGLMultiviewRenderTarget( 0, 0, DEFAULT_NUMVIEWS ); + var viewport = camera.cameras[ i ].viewport; - renderSize = new Vector2(); - mat4 = []; - mat3 = []; - cameraArray = []; + var x1 = viewport.x; + var y1 = viewport.y; + var x2 = x1 + viewport.z; + var y2 = y1 + viewport.w; - var maxViews = capabilities.maxMultiviewViews; - - for ( var i = 0; i < maxViews; i ++ ) { - - mat4[ i ] = new Matrix4(); - mat3[ i ] = new Matrix3(); + gl.bindFramebuffer( gl.READ_FRAMEBUFFER, srcFramebuffers[ i ] ); + gl.blitFramebuffer( 0, 0, viewWidth, viewHeight, x1, y1, x2, y2, gl.COLOR_BUFFER_BIT, gl.NEAREST ); } } - + this.isAvailable = isAvailable; this.attachCamera = attachCamera; this.detachCamera = detachCamera; this.updateCameraProjectionMatricesUniform = updateCameraProjectionMatricesUniform; diff --git a/src/renderers/webgl/WebGLTextures.js b/src/renderers/webgl/WebGLTextures.js index 363212325565eccbc47d78b44d38d0e1b8539b26..e6d8f146920e870a40602e9c5fd57bf66cd985dc 100644 --- a/src/renderers/webgl/WebGLTextures.js +++ b/src/renderers/webgl/WebGLTextures.js @@ -1016,53 +1016,45 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils, } else if ( isMultiview ) { - if ( capabilities.multiview ) { - - var width = renderTarget.width; - var height = renderTarget.height; - var numViews = renderTarget.numViews; - - _gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer ); - - var ext = extensions.get( 'OVR_multiview2' ); - - info.memory.textures += 2; + var width = renderTarget.width; + var height = renderTarget.height; + var numViews = renderTarget.numViews; - var colorTexture = _gl.createTexture(); - _gl.bindTexture( _gl.TEXTURE_2D_ARRAY, colorTexture ); - _gl.texParameteri( _gl.TEXTURE_2D_ARRAY, _gl.TEXTURE_MAG_FILTER, _gl.NEAREST ); - _gl.texParameteri( _gl.TEXTURE_2D_ARRAY, _gl.TEXTURE_MIN_FILTER, _gl.NEAREST ); - _gl.texImage3D( _gl.TEXTURE_2D_ARRAY, 0, _gl.RGBA8, width, height, numViews, 0, _gl.RGBA, _gl.UNSIGNED_BYTE, null ); - ext.framebufferTextureMultiviewOVR( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, colorTexture, 0, 0, numViews ); + _gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer ); - var depthStencilTexture = _gl.createTexture(); - _gl.bindTexture( _gl.TEXTURE_2D_ARRAY, depthStencilTexture ); - _gl.texParameteri( _gl.TEXTURE_2D_ARRAY, _gl.TEXTURE_MAG_FILTER, _gl.NEAREST ); - _gl.texParameteri( _gl.TEXTURE_2D_ARRAY, _gl.TEXTURE_MIN_FILTER, _gl.NEAREST ); - _gl.texImage3D( _gl.TEXTURE_2D_ARRAY, 0, _gl.DEPTH24_STENCIL8, width, height, numViews, 0, _gl.DEPTH_STENCIL, _gl.UNSIGNED_INT_24_8, null ); - ext.framebufferTextureMultiviewOVR( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, depthStencilTexture, 0, 0, numViews ); + var ext = extensions.get( 'OVR_multiview2' ); - var viewFramebuffers = new Array( numViews ); - for ( var i = 0; i < numViews; ++ i ) { + info.memory.textures += 2; - viewFramebuffers[ i ] = _gl.createFramebuffer(); - _gl.bindFramebuffer( _gl.FRAMEBUFFER, viewFramebuffers[ i ] ); - _gl.framebufferTextureLayer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, colorTexture, 0, i ); + var colorTexture = _gl.createTexture(); + _gl.bindTexture( _gl.TEXTURE_2D_ARRAY, colorTexture ); + _gl.texParameteri( _gl.TEXTURE_2D_ARRAY, _gl.TEXTURE_MAG_FILTER, _gl.NEAREST ); + _gl.texParameteri( _gl.TEXTURE_2D_ARRAY, _gl.TEXTURE_MIN_FILTER, _gl.NEAREST ); + _gl.texImage3D( _gl.TEXTURE_2D_ARRAY, 0, _gl.RGBA8, width, height, numViews, 0, _gl.RGBA, _gl.UNSIGNED_BYTE, null ); + ext.framebufferTextureMultiviewOVR( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, colorTexture, 0, 0, numViews ); - } + var depthStencilTexture = _gl.createTexture(); + _gl.bindTexture( _gl.TEXTURE_2D_ARRAY, depthStencilTexture ); + _gl.texParameteri( _gl.TEXTURE_2D_ARRAY, _gl.TEXTURE_MAG_FILTER, _gl.NEAREST ); + _gl.texParameteri( _gl.TEXTURE_2D_ARRAY, _gl.TEXTURE_MIN_FILTER, _gl.NEAREST ); + _gl.texImage3D( _gl.TEXTURE_2D_ARRAY, 0, _gl.DEPTH24_STENCIL8, width, height, numViews, 0, _gl.DEPTH_STENCIL, _gl.UNSIGNED_INT_24_8, null ); + ext.framebufferTextureMultiviewOVR( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, depthStencilTexture, 0, 0, numViews ); - renderTargetProperties.__webglColorTexture = colorTexture; - renderTargetProperties.__webglDepthStencilTexture = depthStencilTexture; - renderTargetProperties.__webglViewFramebuffers = viewFramebuffers; + var viewFramebuffers = new Array( numViews ); + for ( var i = 0; i < numViews; ++ i ) { - _gl.bindFramebuffer( _gl.FRAMEBUFFER, null ); - _gl.bindTexture( _gl.TEXTURE_2D_ARRAY, null ); + viewFramebuffers[ i ] = _gl.createFramebuffer(); + _gl.bindFramebuffer( _gl.FRAMEBUFFER, viewFramebuffers[ i ] ); + _gl.framebufferTextureLayer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, colorTexture, 0, i ); - } else { + } - console.warn( 'THREE.WebGLRenderer: WebGLMultiviewRenderTarget can only be used with WebGL2 and Multiview extension support.' ); + renderTargetProperties.__webglColorTexture = colorTexture; + renderTargetProperties.__webglDepthStencilTexture = depthStencilTexture; + renderTargetProperties.__webglViewFramebuffers = viewFramebuffers; - } + _gl.bindFramebuffer( _gl.FRAMEBUFFER, null ); + _gl.bindTexture( _gl.TEXTURE_2D_ARRAY, null ); }