Browse Source

Clean up multiview render path, create rendertarget

Fernando Serrano 6 years ago
parent
commit
5c1e9abdfb
2 changed files with 25 additions and 25 deletions
  1. 13 22
      src/renderers/WebGLRenderer.js
  2. 12 3
      src/renderers/webgl/WebGLMultiview.js

+ 13 - 22
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 ++ ) {

+ 12 - 3
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 );