Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 9 additions & 6 deletions examples/jsm/utils/RoughnessMipmapper.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@ import {
RawShaderMaterial,
Scene,
Vector2,
WebGLRenderTarget
WebGLRenderTarget,
Vector4
} from "../../../build/three.module.js";

var RoughnessMipmapper = ( function () {
Expand Down Expand Up @@ -55,6 +56,7 @@ var RoughnessMipmapper = ( function () {
var height = Math.max( roughnessMap.image.height, normalMap.image.height );
if ( ! MathUtils.isPowerOfTwo( width ) || ! MathUtils.isPowerOfTwo( height ) ) return;

var oldTarget = _renderer.getRenderTarget();
var autoClear = _renderer.autoClear;
_renderer.autoClear = false;

Expand All @@ -63,6 +65,7 @@ var RoughnessMipmapper = ( function () {
if ( _tempTarget != null ) _tempTarget.dispose();

_tempTarget = new WebGLRenderTarget( width, height, { depthBuffer: false, stencilBuffer: false } );
_tempTarget.scissorTest = true;

}

Expand All @@ -82,7 +85,6 @@ var RoughnessMipmapper = ( function () {

}

_renderer.setRenderTarget( _tempTarget );
_mipmapMaterial.uniforms.roughnessMap.value = roughnessMap;
_mipmapMaterial.uniforms.normalMap.value = normalMap;

Expand All @@ -98,7 +100,10 @@ var RoughnessMipmapper = ( function () {
texelSize.set( 1.0 / width, 1.0 / height );
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.setRenderTarget( _tempTarget );
_renderer.render( _scene, _flatCamera );
_renderer.copyFramebufferToTexture( position, material.roughnessMap, mip );
_mipmapMaterial.uniforms.roughnessMap.value = material.roughnessMap;
Expand All @@ -107,10 +112,8 @@ var RoughnessMipmapper = ( function () {

if ( roughnessMap !== material.roughnessMap ) roughnessMap.dispose();

_renderer.setRenderTarget( oldTarget );
_renderer.autoClear = autoClear;
_renderer.setRenderTarget( null );
var size = _renderer.getSize( new Vector2() );
_renderer.setViewport( 0, 0, size.x, size.y );

},

Expand Down
42 changes: 22 additions & 20 deletions src/extras/PMREMGenerator.js
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ import { Scene } from "../scenes/Scene.js";
import { Vector2 } from "../math/Vector2.js";
import { Vector3 } from "../math/Vector3.js";
import { WebGLRenderTarget } from "../renderers/WebGLRenderTarget.js";
import { Vector4 } from "../../build/three.module.js";

var LOD_MIN = 4;
var LOD_MAX = 8;
Expand Down Expand Up @@ -70,6 +71,8 @@ var { _lodPlanes, _sizeLods, _sigmas } = _createPlanes();
var _pingPongRenderTarget = null;
var _renderer = null;

var _oldTarget = null;

// Golden Ratio
var PHI = ( 1 + Math.sqrt( 5 ) ) / 2;
var INV_PHI = 1 / PHI;
Expand Down Expand Up @@ -107,6 +110,7 @@ PMREMGenerator.prototype = {
*/
fromScene: function ( scene, sigma = 0, near = 0.1, far = 100 ) {

_oldTarget = _renderer.getRenderTarget();
var cubeUVRenderTarget = _allocateTargets();
_sceneToCubeUV( scene, near, far, cubeUVRenderTarget );
if ( sigma > 0 ) {
Expand All @@ -115,8 +119,7 @@ PMREMGenerator.prototype = {

}
_applyPMREM( cubeUVRenderTarget );
_cleanup();
cubeUVRenderTarget.scissorTest = false;
_cleanup( cubeUVRenderTarget );

return cubeUVRenderTarget;

Expand Down Expand Up @@ -144,11 +147,11 @@ PMREMGenerator.prototype = {
*/
fromCubemap: function ( cubemap ) {

_oldTarget = _renderer.getRenderTarget();
var cubeUVRenderTarget = _allocateTargets( cubemap );
_textureToCubeUV( cubemap, cubeUVRenderTarget );
_applyPMREM( cubeUVRenderTarget );
_cleanup();
cubeUVRenderTarget.scissorTest = false;
_cleanup( cubeUVRenderTarget );

return cubeUVRenderTarget;

Expand Down Expand Up @@ -298,12 +301,13 @@ function _allocateTargets( equirectangular ) {

}

function _cleanup() {
function _cleanup( outputTarget ) {

_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 );

}

Expand Down Expand Up @@ -340,7 +344,6 @@ function _sceneToCubeUV( scene, near, far, cubeUVRenderTarget ) {

}

_renderer.setRenderTarget( cubeUVRenderTarget );
for ( var i = 0; i < 6; i ++ ) {

var col = i % 3;
Expand All @@ -360,8 +363,9 @@ function _sceneToCubeUV( scene, near, far, cubeUVRenderTarget ) {
cubeCamera.lookAt( 0, 0, forwardSign[ i ] );

}
_setViewport(
_setViewport( cubeUVRenderTarget,
col * SIZE_MAX, i > 2 ? SIZE_MAX : 0, SIZE_MAX, SIZE_MAX );
_renderer.setRenderTarget( cubeUVRenderTarget );
_renderer.render( scene, cubeCamera );

}
Expand Down Expand Up @@ -407,8 +411,8 @@ function _textureToCubeUV( texture, cubeUVRenderTarget ) {
uniforms[ 'inputEncoding' ].value = ENCODINGS[ texture.encoding ];
uniforms[ 'outputEncoding' ].value = ENCODINGS[ texture.encoding ];

_setViewport( cubeUVRenderTarget, 0, 0, 3 * SIZE_MAX, 2 * SIZE_MAX );
_renderer.setRenderTarget( cubeUVRenderTarget );
_setViewport( 0, 0, 3 * SIZE_MAX, 2 * SIZE_MAX );
_renderer.render( scene, _flatCamera );

}
Expand All @@ -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 );

}

Expand Down Expand Up @@ -568,8 +570,8 @@ function _halfBlur( targetIn, targetOut, lodIn, lodOut, sigmaRadians, direction,
2 * outputSize *
( lodOut > LOD_MAX - LOD_MIN ? lodOut - LOD_MAX + LOD_MIN : 0 );

_setViewport( targetOut, x, y, 3 * outputSize, 2 * outputSize );
_renderer.setRenderTarget( targetOut );
_setViewport( x, y, 3 * outputSize, 2 * outputSize );
_renderer.render( blurScene, _flatCamera );

}
Expand Down