Bläddra i källkod

WebGLRenderer: Track camera per render state. (#28113)

* WebGLRenderer: Track camera per render state.

* WebGLRenderer: Fix render state restore.

* Examples: Clean up.
Michael Herzog 1 år sedan
förälder
incheckning
645ff11b6e

+ 0 - 10
examples/jsm/objects/Reflector.js

@@ -161,16 +161,6 @@ class Reflector extends Mesh {
 
 			renderer.setRenderTarget( currentRenderTarget );
 
-			// Restore viewport
-
-			const viewport = camera.viewport;
-
-			if ( viewport !== undefined ) {
-
-				renderer.state.viewport( viewport );
-
-			}
-
 			scope.visible = true;
 
 		};

+ 0 - 10
examples/jsm/objects/ReflectorForSSRPass.js

@@ -226,16 +226,6 @@ class ReflectorForSSRPass extends Mesh {
 
 			renderer.setRenderTarget( currentRenderTarget );
 
-			// Restore viewport
-
-			const viewport = camera.viewport;
-
-			if ( viewport !== undefined ) {
-
-				renderer.state.viewport( viewport );
-
-			}
-
 			// scope.visible = true;
 
 		};

+ 2 - 12
examples/jsm/objects/Refractor.js

@@ -186,7 +186,7 @@ class Refractor extends Mesh {
 
 		//
 
-		function render( renderer, scene, camera ) {
+		function render( renderer, scene ) {
 
 			scope.visible = false;
 
@@ -205,16 +205,6 @@ class Refractor extends Mesh {
 			renderer.shadowMap.autoUpdate = currentShadowAutoUpdate;
 			renderer.setRenderTarget( currentRenderTarget );
 
-			// restore viewport
-
-			const viewport = camera.viewport;
-
-			if ( viewport !== undefined ) {
-
-				renderer.state.viewport( viewport );
-
-			}
-
 			scope.visible = true;
 
 		}
@@ -239,7 +229,7 @@ class Refractor extends Mesh {
 
 			updateVirtualCamera( camera );
 
-			render( renderer, scene, camera );
+			render( renderer, scene );
 
 		};
 

+ 0 - 10
examples/jsm/objects/Water.js

@@ -314,16 +314,6 @@ class Water extends Mesh {
 
 			renderer.setRenderTarget( currentRenderTarget );
 
-			// Restore viewport
-
-			const viewport = camera.viewport;
-
-			if ( viewport !== undefined ) {
-
-				renderer.state.viewport( viewport );
-
-			}
-
 		};
 
 	}

+ 19 - 0
src/renderers/WebGLRenderer.js

@@ -949,6 +949,7 @@ class WebGLRenderer {
 			}
 
 			currentRenderState.setupLights( _this._useLegacyLights );
+			currentRenderState.setupLightsView( camera );
 
 			// Only initialize materials in the new scene, not the targetScene.
 
@@ -1242,6 +1243,24 @@ class WebGLRenderer {
 
 				currentRenderState = renderStateStack[ renderStateStack.length - 1 ];
 
+				// restore clipping uniforms and viewport
+
+				const renderStateCamera = currentRenderState.state.camera;
+
+				if ( renderStateCamera !== null ) {
+
+					if ( _clippingEnabled === true ) clipping.setGlobalState( _this.clippingPlanes, renderStateCamera );
+
+					const viewport = renderStateCamera.viewport;
+
+					if ( viewport !== undefined ) {
+
+						state.viewport( viewport );
+
+					}
+
+				}
+
 			} else {
 
 				currentRenderState = null;

+ 3 - 0
src/renderers/webgl/WebGLRenderStates.js

@@ -34,6 +34,8 @@ function WebGLRenderState( extensions ) {
 
 	function setupLightsView( camera ) {
 
+		state.camera = camera;
+
 		lights.setupView( lightsArray, camera );
 
 	}
@@ -43,6 +45,7 @@ function WebGLRenderState( extensions ) {
 		shadowsArray: shadowsArray,
 
 		lights: lights,
+		camera: null,
 
 		transmissionRenderTarget: {}
 	};