From 63e278935b3598a943c82056fe1f9c5bfbde0844 Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Sun, 27 Sep 2015 01:35:37 -0400 Subject: [PATCH] Green refactor of Render-to-texture: Use a Texture instance inside WebGLRenderTarget rather than duplicating all internal texture fields. --- src/renderers/WebGLRenderTarget.js | 36 ++++-------------- src/renderers/WebGLRenderer.js | 59 ++++++++++++++++++------------ 2 files changed, 43 insertions(+), 52 deletions(-) diff --git a/src/renderers/WebGLRenderTarget.js b/src/renderers/WebGLRenderTarget.js index 239daec2e6..24e6c428bf 100644 --- a/src/renderers/WebGLRenderTarget.js +++ b/src/renderers/WebGLRenderTarget.js @@ -12,19 +12,13 @@ THREE.WebGLRenderTarget = function ( width, height, options ) { options = options || {}; - this.wrapS = options.wrapS !== undefined ? options.wrapS : THREE.ClampToEdgeWrapping; - this.wrapT = options.wrapT !== undefined ? options.wrapT : THREE.ClampToEdgeWrapping; - - this.magFilter = options.magFilter !== undefined ? options.magFilter : THREE.LinearFilter; - this.minFilter = options.minFilter !== undefined ? options.minFilter : THREE.LinearMipMapLinearFilter; - - this.anisotropy = options.anisotropy !== undefined ? options.anisotropy : 1; - - this.offset = new THREE.Vector2( 0, 0 ); - this.repeat = new THREE.Vector2( 1, 1 ); - - this.format = options.format !== undefined ? options.format : THREE.RGBAFormat; - this.type = options.type !== undefined ? options.type : THREE.UnsignedByteType; + this.texture = new THREE.Texture(undefined, undefined, + options.wrapS, options.wrapT, + options.magFilter, options.minFilter, + options.format, options.type, + options.anisotropy); + // Don't generate mipmaps from target texture + this.texture.generateMipmaps = false; this.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true; this.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : true; @@ -63,25 +57,11 @@ THREE.WebGLRenderTarget.prototype = { this.width = source.width; this.height = source.height; - this.wrapS = source.wrapS; - this.wrapT = source.wrapT; - - this.magFilter = source.magFilter; - this.minFilter = source.minFilter; - - this.anisotropy = source.anisotropy; - - this.offset.copy( source.offset ); - this.repeat.copy( source.repeat ); - - this.format = source.format; - this.type = source.type; + this.texture = this.texture.clone(); this.depthBuffer = source.depthBuffer; this.stencilBuffer = source.stencilBuffer; - this.generateMipmaps = source.generateMipmaps; - this.shareDepthFrom = source.shareDepthFrom; return this; diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js index 722d73df15..0e0a243724 100644 --- a/src/renderers/WebGLRenderer.js +++ b/src/renderers/WebGLRenderer.js @@ -558,10 +558,11 @@ THREE.WebGLRenderer = function ( parameters ) { function deallocateRenderTarget( renderTarget ) { var renderTargetProperties = properties.get( renderTarget ); + var textureProperties = properties.get( renderTarget.texture ); - if ( ! renderTarget || renderTargetProperties.__webglTexture === undefined ) return; + if ( ! renderTarget || textureProperties.__webglTexture === undefined ) return; - _gl.deleteTexture( renderTargetProperties.__webglTexture ); + _gl.deleteTexture( textureProperties.__webglTexture ); if ( renderTarget instanceof THREE.WebGLRenderTargetCube ) { @@ -579,6 +580,7 @@ THREE.WebGLRenderer = function ( parameters ) { } + properties.delete( renderTarget.texture ); properties.delete( renderTarget ); } @@ -1156,11 +1158,14 @@ THREE.WebGLRenderer = function ( parameters ) { lensFlarePlugin.render( scene, camera, _currentWidth, _currentHeight ); // Generate mipmap if we're using any kind of mipmap filtering - - if ( renderTarget && renderTarget.generateMipmaps && renderTarget.minFilter !== THREE.NearestFilter && renderTarget.minFilter !== THREE.LinearFilter ) { - - updateRenderTargetMipmap( renderTarget ); - + + if ( renderTarget ) { + var texture = renderTarget.texture; + if ( texture.generateMipmaps && + texture.minFilter !== THREE.NearestFilter && + texture.minFilter !== THREE.LinearFilter ) { + updateRenderTargetMipmap( renderTarget ); + } } // Ensure depth buffer writing is enabled so it can be cleared on next render @@ -1800,6 +1805,7 @@ THREE.WebGLRenderer = function ( parameters ) { if ( uvScaleMap !== undefined ) { + if ( uvScaleMap instanceof THREE.WebGLRenderTarget ) uvScaleMap = uvScaleMap.texture; var offset = uvScaleMap.offset; var repeat = uvScaleMap.repeat; @@ -2314,7 +2320,11 @@ THREE.WebGLRenderer = function ( parameters ) { } else if ( texture instanceof THREE.WebGLRenderTargetCube ) { - setCubeTextureDynamic( texture, textureUnit ); + setCubeTextureDynamic( texture.texture, textureUnit ); + + } else if ( texture instanceof THREE.WebGLRenderTarget ) { + + _this.setTexture( texture.texture, textureUnit ); } else { @@ -2975,7 +2985,7 @@ THREE.WebGLRenderer = function ( parameters ) { function setupFrameBuffer ( framebuffer, renderTarget, textureTarget ) { _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); - _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, textureTarget, properties.get( renderTarget ).__webglTexture, 0 ); + _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, textureTarget, properties.get( renderTarget.texture ).__webglTexture, 0 ); } @@ -3015,30 +3025,31 @@ THREE.WebGLRenderer = function ( parameters ) { if ( renderTarget && properties.get( renderTarget ).__webglFramebuffer === undefined ) { var renderTargetProperties = properties.get( renderTarget ); + var textureProperties = properties.get( renderTarget.texture ); if ( renderTarget.depthBuffer === undefined ) renderTarget.depthBuffer = true; if ( renderTarget.stencilBuffer === undefined ) renderTarget.stencilBuffer = true; renderTarget.addEventListener( 'dispose', onRenderTargetDispose ); - renderTargetProperties.__webglTexture = _gl.createTexture(); + textureProperties.__webglTexture = _gl.createTexture(); _infoMemory.textures ++; // Setup texture, create render and frame buffers var isTargetPowerOfTwo = THREE.Math.isPowerOfTwo( renderTarget.width ) && THREE.Math.isPowerOfTwo( renderTarget.height ), - glFormat = paramThreeToGL( renderTarget.format ), - glType = paramThreeToGL( renderTarget.type ); + glFormat = paramThreeToGL( renderTarget.texture.format ), + glType = paramThreeToGL( renderTarget.texture.type ); if ( isCube ) { renderTargetProperties.__webglFramebuffer = []; renderTargetProperties.__webglRenderbuffer = []; - state.bindTexture( _gl.TEXTURE_CUBE_MAP, renderTargetProperties.__webglTexture ); + state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture ); - setTextureParameters( _gl.TEXTURE_CUBE_MAP, renderTarget, isTargetPowerOfTwo ); + setTextureParameters( _gl.TEXTURE_CUBE_MAP, renderTarget.texture, isTargetPowerOfTwo ); for ( var i = 0; i < 6; i ++ ) { @@ -3051,7 +3062,7 @@ THREE.WebGLRenderer = function ( parameters ) { } - if ( renderTarget.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_CUBE_MAP ); + if ( renderTarget.texture.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_CUBE_MAP ); } else { @@ -3067,8 +3078,8 @@ THREE.WebGLRenderer = function ( parameters ) { } - state.bindTexture( _gl.TEXTURE_2D, renderTargetProperties.__webglTexture ); - setTextureParameters( _gl.TEXTURE_2D, renderTarget, isTargetPowerOfTwo ); + state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture ); + setTextureParameters( _gl.TEXTURE_2D, renderTarget.texture, isTargetPowerOfTwo ); state.texImage2D( _gl.TEXTURE_2D, 0, glFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null ); @@ -3092,7 +3103,7 @@ THREE.WebGLRenderer = function ( parameters ) { } - if ( renderTarget.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_2D ); + if ( renderTarget.texture.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_2D ); } @@ -3158,8 +3169,8 @@ THREE.WebGLRenderer = function ( parameters ) { if ( isCube ) { - var renderTargetProperties = properties.get( renderTarget ); - _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + renderTarget.activeCubeFace, renderTargetProperties.__webglTexture, 0 ); + var textureProperties = properties.get( renderTarget.texture ); + _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + renderTarget.activeCubeFace, textureProperties.__webglTexture, 0 ); } @@ -3189,14 +3200,14 @@ THREE.WebGLRenderer = function ( parameters ) { } - if ( renderTarget.format !== THREE.RGBAFormat && paramThreeToGL( renderTarget.format ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) { + if ( renderTarget.texture.format !== THREE.RGBAFormat && paramThreeToGL( renderTarget.texture.format ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) { console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' ); return; } - if ( renderTarget.type !== THREE.UnsignedByteType && paramThreeToGL( renderTarget.type ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_TYPE ) ) { + if ( renderTarget.texture.type !== THREE.UnsignedByteType && paramThreeToGL( renderTarget.texture.type ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_TYPE ) ) { console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' ); return; @@ -3205,7 +3216,7 @@ THREE.WebGLRenderer = function ( parameters ) { if ( _gl.checkFramebufferStatus( _gl.FRAMEBUFFER ) === _gl.FRAMEBUFFER_COMPLETE ) { - _gl.readPixels( x, y, width, height, paramThreeToGL( renderTarget.format ), paramThreeToGL( renderTarget.type ), buffer ); + _gl.readPixels( x, y, width, height, paramThreeToGL( renderTarget.texture.format ), paramThreeToGL( renderTarget.texture.type ), buffer ); } else { @@ -3226,7 +3237,7 @@ THREE.WebGLRenderer = function ( parameters ) { function updateRenderTargetMipmap( renderTarget ) { var target = renderTarget instanceof THREE.WebGLRenderTargetCube ? _gl.TEXTURE_CUBE_MAP : _gl.TEXTURE_2D; - var texture = properties.get( renderTarget ).__webglTexture; + var texture = properties.get( renderTarget.texture ).__webglTexture; state.bindTexture( target, texture ); _gl.generateMipmap( target ); -- GitLab