From 5c1e9abdfb205764f2eed57adf8f30eb4aade7cd Mon Sep 17 00:00:00 2001 From: Fernando Serrano Date: Tue, 23 Apr 2019 18:37:59 +0200 Subject: [PATCH] Clean up multiview render path, create rendertarget --- src/renderers/WebGLRenderer.js | 35 ++++++++++----------------- src/renderers/webgl/WebGLMultiview.js | 15 +++++++++--- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js index 778f739dc4..69465bb46f 100644 --- a/src/renderers/WebGLRenderer.js +++ b/src/renderers/WebGLRenderer.js @@ -315,7 +315,7 @@ function WebGLRenderer( parameters ) { this.vr = vr; - var multiview = this.multiview = new WebGLMultiview( _multiviewRequested, _gl, _canvas, extensions, capabilities ); + var multiview = this.multiview = new WebGLMultiview( _multiviewRequested, _gl, _canvas, extensions, capabilities, properties ); // shadow map @@ -1178,8 +1178,14 @@ function WebGLRenderer( parameters ) { this.setRenderTarget( renderTarget ); + } else if ( this.multiview.isEnabled() ) { + + this.setRenderTarget( this.multiview.renderTarget ); + this.multiview.bindFramebuffer( camera ); + } + // background.render( currentRenderList, scene, camera, forceClear ); @@ -1224,6 +1230,12 @@ function WebGLRenderer( parameters ) { textures.updateMultisampleRenderTarget( _currentRenderTarget ); + if ( this.multiview.isEnabled() ) { + + this.multiview.unbindFramebuffer( camera ); + + } + } // Ensure depth buffer writing is enabled so it can be cleared on next render @@ -1369,25 +1381,6 @@ function WebGLRenderer( parameters ) { if ( multiview.isEnabled() ) { - multiview.bindMultiviewFrameBuffer( camera ); - - _gl.disable( _gl.SCISSOR_TEST ); - - if ( camera.isArrayCamera ) { - - var height = _canvas.height; - var width = Math.floor( _canvas.width * 0.5 ); - - } else { - - var width = _canvas.width; - var height = _canvas.height; - - } - _gl.viewport( 0, 0, width, height ); - - _gl.clear( _gl.COLOR_BUFFER_BIT | _gl.DEPTH_BUFFER_BIT | _gl.STENCIL_BUFFER_BIT ); - for ( var i = 0, l = renderList.length; i < l; i ++ ) { var renderItem = renderList[ i ]; @@ -1401,8 +1394,6 @@ function WebGLRenderer( parameters ) { } - multiview.unbindMultiviewFrameBuffer( camera ); - } else { for ( var i = 0, l = renderList.length; i < l; i ++ ) { diff --git a/src/renderers/webgl/WebGLMultiview.js b/src/renderers/webgl/WebGLMultiview.js index 647178331f..3c5f29d6bf 100644 --- a/src/renderers/webgl/WebGLMultiview.js +++ b/src/renderers/webgl/WebGLMultiview.js @@ -2,7 +2,9 @@ * @author fernandojsg / http://fernandojsg.com */ -function WebGLMultiview( requested, gl, canvas, extensions, capabilities ) { +import { WebGLRenderTarget } from '../WebGLRenderTarget.js'; + +function WebGLMultiview( requested, gl, canvas, extensions, capabilities, properties ) { this.isAvailable = function () { @@ -81,9 +83,14 @@ function WebGLMultiview( requested, gl, canvas, extensions, capabilities ) { framebufferWidth = halfWidth; framebufferHeight = canvas.height; + this.renderTarget = new WebGLRenderTarget( framebufferWidth, framebufferHeight ); + + // @hack This should be done in WebGLTextures? + properties.get( this.renderTarget ).__webglFramebuffer = framebuffer; + }; - this.bindMultiviewFrameBuffer = function ( camera ) { + this.bindFramebuffer = function ( camera ) { var width = canvas.width; var height = canvas.height; @@ -108,13 +115,15 @@ function WebGLMultiview( requested, gl, canvas, extensions, capabilities ) { framebufferWidth = width; framebufferHeight = height; + this.renderTarget.setSize( width, height ); + } gl.bindFramebuffer( gl.DRAW_FRAMEBUFFER, framebuffer ); }; - this.unbindMultiviewFrameBuffer = function ( camera ) { + this.unbindFramebuffer = function ( camera ) { gl.bindFramebuffer( gl.DRAW_FRAMEBUFFER, null ); -- GitLab