Browse Source

fixing viewport/scissor

Emmett Lalish 5 years ago
parent
commit
5ec96a8b47
2 changed files with 29 additions and 24 deletions
  1. 8 5
      examples/jsm/utils/RoughnessMipmapper.js
  2. 21 19
      src/extras/PMREMGenerator.js

+ 8 - 5
examples/jsm/utils/RoughnessMipmapper.js

@@ -18,7 +18,8 @@ import {
 	RawShaderMaterial,
 	RawShaderMaterial,
 	Scene,
 	Scene,
 	Vector2,
 	Vector2,
-	WebGLRenderTarget
+	WebGLRenderTarget,
+	Vector4
 } from "../../../build/three.module.js";
 } from "../../../build/three.module.js";
 
 
 var RoughnessMipmapper = ( function () {
 var RoughnessMipmapper = ( function () {
@@ -55,6 +56,7 @@ var RoughnessMipmapper = ( function () {
 			var height = Math.max( roughnessMap.image.height, normalMap.image.height );
 			var height = Math.max( roughnessMap.image.height, normalMap.image.height );
 			if ( ! MathUtils.isPowerOfTwo( width ) || ! MathUtils.isPowerOfTwo( height ) ) return;
 			if ( ! MathUtils.isPowerOfTwo( width ) || ! MathUtils.isPowerOfTwo( height ) ) return;
 
 
+			var oldTarget = _renderer.getRenderTarget();
 			var autoClear = _renderer.autoClear;
 			var autoClear = _renderer.autoClear;
 			_renderer.autoClear = false;
 			_renderer.autoClear = false;
 
 
@@ -63,6 +65,7 @@ var RoughnessMipmapper = ( function () {
 				if ( _tempTarget != null ) _tempTarget.dispose();
 				if ( _tempTarget != null ) _tempTarget.dispose();
 
 
 				_tempTarget = new WebGLRenderTarget( width, height, { depthBuffer: false, stencilBuffer: false } );
 				_tempTarget = new WebGLRenderTarget( width, height, { depthBuffer: false, stencilBuffer: false } );
+				_tempTarget.scissorTest = true;
 
 
 			}
 			}
 
 
@@ -98,7 +101,9 @@ var RoughnessMipmapper = ( function () {
 				texelSize.set( 1.0 / width, 1.0 / height );
 				texelSize.set( 1.0 / width, 1.0 / height );
 				if ( mip == 0 ) texelSize.set( 0.0, 0.0 );
 				if ( mip == 0 ) texelSize.set( 0.0, 0.0 );
 
 
-				_renderer.setViewport( position.x, position.y, width / dpr, height / dpr );
+				var viewport = new Vector4( position.x, position.y, width / dpr, height / dpr );
+				_tempTarget.viewport.copy( viewport );
+				_tempTarget.scissor.copy( viewport );
 				_renderer.render( _scene, _flatCamera );
 				_renderer.render( _scene, _flatCamera );
 				_renderer.copyFramebufferToTexture( position, material.roughnessMap, mip );
 				_renderer.copyFramebufferToTexture( position, material.roughnessMap, mip );
 				_mipmapMaterial.uniforms.roughnessMap.value = material.roughnessMap;
 				_mipmapMaterial.uniforms.roughnessMap.value = material.roughnessMap;
@@ -107,10 +112,8 @@ var RoughnessMipmapper = ( function () {
 
 
 			if ( roughnessMap !== material.roughnessMap ) roughnessMap.dispose();
 			if ( roughnessMap !== material.roughnessMap ) roughnessMap.dispose();
 
 
+			_renderer.setRenderTarget( oldTarget );
 			_renderer.autoClear = autoClear;
 			_renderer.autoClear = autoClear;
-			_renderer.setRenderTarget( null );
-			var size = _renderer.getSize( new Vector2() );
-			_renderer.setViewport( 0, 0, size.x, size.y );
 
 
 		},
 		},
 
 

+ 21 - 19
src/extras/PMREMGenerator.js

@@ -38,6 +38,7 @@ import { Scene } from "../scenes/Scene.js";
 import { Vector2 } from "../math/Vector2.js";
 import { Vector2 } from "../math/Vector2.js";
 import { Vector3 } from "../math/Vector3.js";
 import { Vector3 } from "../math/Vector3.js";
 import { WebGLRenderTarget } from "../renderers/WebGLRenderTarget.js";
 import { WebGLRenderTarget } from "../renderers/WebGLRenderTarget.js";
+import { Vector4 } from "../../build/three.module.js";
 
 
 var LOD_MIN = 4;
 var LOD_MIN = 4;
 var LOD_MAX = 8;
 var LOD_MAX = 8;
@@ -70,6 +71,8 @@ var { _lodPlanes, _sizeLods, _sigmas } = _createPlanes();
 var _pingPongRenderTarget = null;
 var _pingPongRenderTarget = null;
 var _renderer = null;
 var _renderer = null;
 
 
+var _oldTarget = null;
+
 // Golden Ratio
 // Golden Ratio
 var PHI = ( 1 + Math.sqrt( 5 ) ) / 2;
 var PHI = ( 1 + Math.sqrt( 5 ) ) / 2;
 var INV_PHI = 1 / PHI;
 var INV_PHI = 1 / PHI;
@@ -107,6 +110,7 @@ PMREMGenerator.prototype = {
 	 */
 	 */
 	fromScene: function ( scene, sigma = 0, near = 0.1, far = 100 ) {
 	fromScene: function ( scene, sigma = 0, near = 0.1, far = 100 ) {
 
 
+		_oldTarget = _renderer.getRenderTarget();
 		var cubeUVRenderTarget = _allocateTargets();
 		var cubeUVRenderTarget = _allocateTargets();
 		_sceneToCubeUV( scene, near, far, cubeUVRenderTarget );
 		_sceneToCubeUV( scene, near, far, cubeUVRenderTarget );
 		if ( sigma > 0 ) {
 		if ( sigma > 0 ) {
@@ -115,8 +119,7 @@ PMREMGenerator.prototype = {
 
 
 		}
 		}
 		_applyPMREM( cubeUVRenderTarget );
 		_applyPMREM( cubeUVRenderTarget );
-		_cleanup();
-		cubeUVRenderTarget.scissorTest = false;
+		_cleanup( cubeUVRenderTarget );
 
 
 		return cubeUVRenderTarget;
 		return cubeUVRenderTarget;
 
 
@@ -144,11 +147,11 @@ PMREMGenerator.prototype = {
 	 */
 	 */
 	fromCubemap: function ( cubemap ) {
 	fromCubemap: function ( cubemap ) {
 
 
+		_oldTarget = _renderer.getRenderTarget();
 		var cubeUVRenderTarget = _allocateTargets( cubemap );
 		var cubeUVRenderTarget = _allocateTargets( cubemap );
 		_textureToCubeUV( cubemap, cubeUVRenderTarget );
 		_textureToCubeUV( cubemap, cubeUVRenderTarget );
 		_applyPMREM( cubeUVRenderTarget );
 		_applyPMREM( cubeUVRenderTarget );
-		_cleanup();
-		cubeUVRenderTarget.scissorTest = false;
+		_cleanup( cubeUVRenderTarget );
 
 
 		return cubeUVRenderTarget;
 		return cubeUVRenderTarget;
 
 
@@ -298,12 +301,13 @@ function _allocateTargets( equirectangular ) {
 
 
 }
 }
 
 
-function _cleanup() {
+function _cleanup( outputTarget ) {
 
 
 	_pingPongRenderTarget.dispose();
 	_pingPongRenderTarget.dispose();
-	_renderer.setRenderTarget( null );
-	var size = _renderer.getSize( new Vector2() );
-	_renderer.setViewport( 0, 0, size.x, size.y );
+	_renderer.setRenderTarget( _oldTarget );
+	outputTarget.scissorTest = false;
+	// reset viewport and scissor
+	outputTarget.setSize( outputTarget.width, outputTarget.height );
 
 
 }
 }
 
 
@@ -360,7 +364,7 @@ function _sceneToCubeUV( scene, near, far, cubeUVRenderTarget ) {
 			cubeCamera.lookAt( 0, 0, forwardSign[ i ] );
 			cubeCamera.lookAt( 0, 0, forwardSign[ i ] );
 
 
 		}
 		}
-		_setViewport(
+		_setViewport( cubeUVRenderTarget,
 			col * SIZE_MAX, i > 2 ? SIZE_MAX : 0, SIZE_MAX, SIZE_MAX );
 			col * SIZE_MAX, i > 2 ? SIZE_MAX : 0, SIZE_MAX, SIZE_MAX );
 		_renderer.render( scene, cubeCamera );
 		_renderer.render( scene, cubeCamera );
 
 
@@ -408,7 +412,7 @@ function _textureToCubeUV( texture, cubeUVRenderTarget ) {
 	uniforms[ 'outputEncoding' ].value = ENCODINGS[ texture.encoding ];
 	uniforms[ 'outputEncoding' ].value = ENCODINGS[ texture.encoding ];
 
 
 	_renderer.setRenderTarget( cubeUVRenderTarget );
 	_renderer.setRenderTarget( cubeUVRenderTarget );
-	_setViewport( 0, 0, 3 * SIZE_MAX, 2 * SIZE_MAX );
+	_setViewport( cubeUVRenderTarget, 0, 0, 3 * SIZE_MAX, 2 * SIZE_MAX );
 	_renderer.render( scene, _flatCamera );
 	_renderer.render( scene, _flatCamera );
 
 
 }
 }
@@ -431,15 +435,13 @@ function _createRenderTarget( params ) {
 
 
 }
 }
 
 
-function _setViewport( x, y, width, height ) {
+function _setViewport( target, x, y, width, height ) {
+
+	var viewport = new Vector4( x, y, width, height );
+	viewport.addScalar( 0.5 ).divideScalar( _renderer.getPixelRatio() );
 
 
-	var invDpr = 1.0 / _renderer.getPixelRatio();
-	x = ( x + 0.5 ) * invDpr;
-	y = ( y + 0.5 ) * invDpr;
-	width = ( width + 0.5 ) * invDpr;
-	height = ( height + 0.5 ) * invDpr;
-	_renderer.setViewport( x, y, width, height );
-	_renderer.setScissor( x, y, width, height );
+	target.viewport.copy( viewport );
+	target.scissor.copy( viewport );
 
 
 }
 }
 
 
@@ -569,7 +571,7 @@ function _halfBlur( targetIn, targetOut, lodIn, lodOut, sigmaRadians, direction,
 		( lodOut > LOD_MAX - LOD_MIN ? lodOut - LOD_MAX + LOD_MIN : 0 );
 		( lodOut > LOD_MAX - LOD_MIN ? lodOut - LOD_MAX + LOD_MIN : 0 );
 
 
 	_renderer.setRenderTarget( targetOut );
 	_renderer.setRenderTarget( targetOut );
-	_setViewport( x, y, 3 * outputSize, 2 * outputSize );
+	_setViewport( targetOut, x, y, 3 * outputSize, 2 * outputSize );
 	_renderer.render( blurScene, _flatCamera );
 	_renderer.render( blurScene, _flatCamera );
 
 
 }
 }