Browse Source

Merge pull request #17596 from mrdoob/multiview

WebGLMultiview: Brought back non-ArrayCamera code path and only use in VR.
Mr.doob 5 years ago
parent
commit
598894473b
2 changed files with 53 additions and 22 deletions
  1. 6 6
      src/renderers/WebGLRenderer.js
  2. 47 16
      src/renderers/webgl/WebGLMultiview.js

+ 6 - 6
src/renderers/WebGLRenderer.js

@@ -1197,7 +1197,7 @@ function WebGLRenderer( parameters ) {
 
 		}
 
-		if ( camera.isArrayCamera && multiview.isAvailable() ) {
+		if ( vr.enabled && multiview.isAvailable() ) {
 
 			multiview.attachCamera( camera );
 
@@ -1257,13 +1257,13 @@ function WebGLRenderer( parameters ) {
 
 		state.setPolygonOffset( false );
 
-		if ( camera.isArrayCamera && multiview.isAvailable() ) {
+		if ( vr.enabled ) {
 
-			multiview.detachCamera( camera );
+			if ( multiview.isAvailable() ) {
 
-		}
+				multiview.detachCamera( camera );
 
-		if ( vr.enabled ) {
+			}
 
 			vr.submitFrame();
 
@@ -1416,7 +1416,7 @@ function WebGLRenderer( parameters ) {
 
 				_currentArrayCamera = camera;
 
-				if ( multiview.isAvailable() ) {
+				if ( vr.enabled && multiview.isAvailable() ) {
 
 					renderObject( object, scene, camera, geometry, material, group );
 

+ 47 - 16
src/renderers/webgl/WebGLMultiview.js

@@ -16,7 +16,7 @@ function WebGLMultiview( renderer, gl ) {
 	var properties = renderer.properties;
 
 	var renderTarget, currentRenderTarget;
-	var mat3, mat4, renderSize;
+	var mat3, mat4, cameraArray, renderSize;
 
 	var available;
 	var maxNumViews = 0;
@@ -39,6 +39,7 @@ function WebGLMultiview( renderer, gl ) {
 				renderSize = new Vector2();
 				mat4 = [];
 				mat3 = [];
+				cameraArray = [];
 
 				for ( var i = 0; i < maxNumViews; i ++ ) {
 
@@ -55,9 +56,19 @@ function WebGLMultiview( renderer, gl ) {
 
 	}
 
+	function getCameraArray( camera ) {
+
+		if ( camera.isArrayCamera ) return camera.cameras;
+
+		cameraArray[ 0 ] = camera;
+
+		return cameraArray;
+
+	}
+
 	function updateCameraProjectionMatricesUniform( camera, uniforms ) {
 
-		var cameras = camera.cameras;
+		var cameras = getCameraArray( camera );
 
 		for ( var i = 0; i < cameras.length; i ++ ) {
 
@@ -71,7 +82,7 @@ function WebGLMultiview( renderer, gl ) {
 
 	function updateCameraViewMatricesUniform( camera, uniforms ) {
 
-		var cameras = camera.cameras;
+		var cameras = getCameraArray( camera );
 
 		for ( var i = 0; i < cameras.length; i ++ ) {
 
@@ -85,7 +96,7 @@ function WebGLMultiview( renderer, gl ) {
 
 	function updateObjectMatricesUniforms( object, camera, uniforms ) {
 
-		var cameras = camera.cameras;
+		var cameras = getCameraArray( camera );
 
 		for ( var i = 0; i < cameras.length; i ++ ) {
 
@@ -101,6 +112,8 @@ function WebGLMultiview( renderer, gl ) {
 
 	function isMultiviewCompatible( camera ) {
 
+		if ( camera.isArrayCamera === undefined ) return true;
+
 		var cameras = camera.cameras;
 
 		if ( cameras.length > maxNumViews ) return false;
@@ -128,16 +141,25 @@ function WebGLMultiview( renderer, gl ) {
 
 		}
 
-		var viewport = camera.cameras[ 0 ].viewport;
+		if ( camera.isArrayCamera ) {
+
+			var viewport = camera.cameras[ 0 ].viewport;
 
-		renderTarget.setSize( viewport.z, viewport.w );
-		renderTarget.setNumViews( camera.cameras.length );
+			renderTarget.setSize( viewport.z, viewport.w );
+			renderTarget.setNumViews( camera.cameras.length );
+
+		} else {
+
+			renderTarget.setSize( renderSize.x, renderSize.y );
+			renderTarget.setNumViews( DEFAULT_NUMVIEWS );
+
+		}
 
 	}
 
 	function attachCamera( camera ) {
 
-		if ( ! isMultiviewCompatible( camera ) ) return;
+		if ( isMultiviewCompatible( camera ) === false ) return;
 
 		currentRenderTarget = renderer.getRenderTarget();
 		resizeRenderTarget( camera );
@@ -165,17 +187,26 @@ function WebGLMultiview( renderer, gl ) {
 		var viewWidth = srcRenderTarget.width;
 		var viewHeight = srcRenderTarget.height;
 
-		for ( var i = 0; i < numViews; i ++ ) {
+		if ( camera.isArrayCamera ) {
+
+			for ( var i = 0; i < numViews; i ++ ) {
 
-			var viewport = camera.cameras[ i ].viewport;
+				var viewport = camera.cameras[ i ].viewport;
 
-			var x1 = viewport.x;
-			var y1 = viewport.y;
-			var x2 = x1 + viewport.z;
-			var y2 = y1 + viewport.w;
+				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[ i ] );
-			gl.blitFramebuffer( 0, 0, viewWidth, viewHeight, x1, y1, x2, y2, gl.COLOR_BUFFER_BIT, gl.NEAREST );
+			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 );
 
 		}