提交 63e27893 编写于 作者: M Marius Kintel

Green refactor of Render-to-texture: Use a Texture instance inside...

Green refactor of Render-to-texture: Use a Texture instance inside WebGLRenderTarget rather than duplicating all internal texture fields.
上级 790fdaf2
...@@ -12,19 +12,13 @@ THREE.WebGLRenderTarget = function ( width, height, options ) { ...@@ -12,19 +12,13 @@ THREE.WebGLRenderTarget = function ( width, height, options ) {
options = options || {}; options = options || {};
this.wrapS = options.wrapS !== undefined ? options.wrapS : THREE.ClampToEdgeWrapping; this.texture = new THREE.Texture(undefined, undefined,
this.wrapT = options.wrapT !== undefined ? options.wrapT : THREE.ClampToEdgeWrapping; options.wrapS, options.wrapT,
options.magFilter, options.minFilter,
this.magFilter = options.magFilter !== undefined ? options.magFilter : THREE.LinearFilter; options.format, options.type,
this.minFilter = options.minFilter !== undefined ? options.minFilter : THREE.LinearMipMapLinearFilter; options.anisotropy);
// Don't generate mipmaps from target texture
this.anisotropy = options.anisotropy !== undefined ? options.anisotropy : 1; this.texture.generateMipmaps = false;
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.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true; this.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true;
this.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : true; this.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : true;
...@@ -63,25 +57,11 @@ THREE.WebGLRenderTarget.prototype = { ...@@ -63,25 +57,11 @@ THREE.WebGLRenderTarget.prototype = {
this.width = source.width; this.width = source.width;
this.height = source.height; this.height = source.height;
this.wrapS = source.wrapS; this.texture = this.texture.clone();
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.depthBuffer = source.depthBuffer; this.depthBuffer = source.depthBuffer;
this.stencilBuffer = source.stencilBuffer; this.stencilBuffer = source.stencilBuffer;
this.generateMipmaps = source.generateMipmaps;
this.shareDepthFrom = source.shareDepthFrom; this.shareDepthFrom = source.shareDepthFrom;
return this; return this;
......
...@@ -558,10 +558,11 @@ THREE.WebGLRenderer = function ( parameters ) { ...@@ -558,10 +558,11 @@ THREE.WebGLRenderer = function ( parameters ) {
function deallocateRenderTarget( renderTarget ) { function deallocateRenderTarget( renderTarget ) {
var renderTargetProperties = properties.get( 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 ) { if ( renderTarget instanceof THREE.WebGLRenderTargetCube ) {
...@@ -579,6 +580,7 @@ THREE.WebGLRenderer = function ( parameters ) { ...@@ -579,6 +580,7 @@ THREE.WebGLRenderer = function ( parameters ) {
} }
properties.delete( renderTarget.texture );
properties.delete( renderTarget ); properties.delete( renderTarget );
} }
...@@ -1156,11 +1158,14 @@ THREE.WebGLRenderer = function ( parameters ) { ...@@ -1156,11 +1158,14 @@ THREE.WebGLRenderer = function ( parameters ) {
lensFlarePlugin.render( scene, camera, _currentWidth, _currentHeight ); lensFlarePlugin.render( scene, camera, _currentWidth, _currentHeight );
// Generate mipmap if we're using any kind of mipmap filtering // Generate mipmap if we're using any kind of mipmap filtering
if ( renderTarget && renderTarget.generateMipmaps && renderTarget.minFilter !== THREE.NearestFilter && renderTarget.minFilter !== THREE.LinearFilter ) { if ( renderTarget ) {
var texture = renderTarget.texture;
updateRenderTargetMipmap( renderTarget ); 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 // Ensure depth buffer writing is enabled so it can be cleared on next render
...@@ -1800,6 +1805,7 @@ THREE.WebGLRenderer = function ( parameters ) { ...@@ -1800,6 +1805,7 @@ THREE.WebGLRenderer = function ( parameters ) {
if ( uvScaleMap !== undefined ) { if ( uvScaleMap !== undefined ) {
if ( uvScaleMap instanceof THREE.WebGLRenderTarget ) uvScaleMap = uvScaleMap.texture;
var offset = uvScaleMap.offset; var offset = uvScaleMap.offset;
var repeat = uvScaleMap.repeat; var repeat = uvScaleMap.repeat;
...@@ -2314,7 +2320,11 @@ THREE.WebGLRenderer = function ( parameters ) { ...@@ -2314,7 +2320,11 @@ THREE.WebGLRenderer = function ( parameters ) {
} else if ( texture instanceof THREE.WebGLRenderTargetCube ) { } 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 { } else {
...@@ -2975,7 +2985,7 @@ THREE.WebGLRenderer = function ( parameters ) { ...@@ -2975,7 +2985,7 @@ THREE.WebGLRenderer = function ( parameters ) {
function setupFrameBuffer ( framebuffer, renderTarget, textureTarget ) { function setupFrameBuffer ( framebuffer, renderTarget, textureTarget ) {
_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); _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 ) { ...@@ -3015,30 +3025,31 @@ THREE.WebGLRenderer = function ( parameters ) {
if ( renderTarget && properties.get( renderTarget ).__webglFramebuffer === undefined ) { if ( renderTarget && properties.get( renderTarget ).__webglFramebuffer === undefined ) {
var renderTargetProperties = properties.get( renderTarget ); var renderTargetProperties = properties.get( renderTarget );
var textureProperties = properties.get( renderTarget.texture );
if ( renderTarget.depthBuffer === undefined ) renderTarget.depthBuffer = true; if ( renderTarget.depthBuffer === undefined ) renderTarget.depthBuffer = true;
if ( renderTarget.stencilBuffer === undefined ) renderTarget.stencilBuffer = true; if ( renderTarget.stencilBuffer === undefined ) renderTarget.stencilBuffer = true;
renderTarget.addEventListener( 'dispose', onRenderTargetDispose ); renderTarget.addEventListener( 'dispose', onRenderTargetDispose );
renderTargetProperties.__webglTexture = _gl.createTexture(); textureProperties.__webglTexture = _gl.createTexture();
_infoMemory.textures ++; _infoMemory.textures ++;
// Setup texture, create render and frame buffers // Setup texture, create render and frame buffers
var isTargetPowerOfTwo = THREE.Math.isPowerOfTwo( renderTarget.width ) && THREE.Math.isPowerOfTwo( renderTarget.height ), var isTargetPowerOfTwo = THREE.Math.isPowerOfTwo( renderTarget.width ) && THREE.Math.isPowerOfTwo( renderTarget.height ),
glFormat = paramThreeToGL( renderTarget.format ), glFormat = paramThreeToGL( renderTarget.texture.format ),
glType = paramThreeToGL( renderTarget.type ); glType = paramThreeToGL( renderTarget.texture.type );
if ( isCube ) { if ( isCube ) {
renderTargetProperties.__webglFramebuffer = []; renderTargetProperties.__webglFramebuffer = [];
renderTargetProperties.__webglRenderbuffer = []; 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 ++ ) { for ( var i = 0; i < 6; i ++ ) {
...@@ -3051,7 +3062,7 @@ THREE.WebGLRenderer = function ( parameters ) { ...@@ -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 { } else {
...@@ -3067,8 +3078,8 @@ THREE.WebGLRenderer = function ( parameters ) { ...@@ -3067,8 +3078,8 @@ THREE.WebGLRenderer = function ( parameters ) {
} }
state.bindTexture( _gl.TEXTURE_2D, renderTargetProperties.__webglTexture ); state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );
setTextureParameters( _gl.TEXTURE_2D, renderTarget, isTargetPowerOfTwo ); setTextureParameters( _gl.TEXTURE_2D, renderTarget.texture, isTargetPowerOfTwo );
state.texImage2D( _gl.TEXTURE_2D, 0, glFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null ); state.texImage2D( _gl.TEXTURE_2D, 0, glFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );
...@@ -3092,7 +3103,7 @@ THREE.WebGLRenderer = function ( parameters ) { ...@@ -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 ) { ...@@ -3158,8 +3169,8 @@ THREE.WebGLRenderer = function ( parameters ) {
if ( isCube ) { if ( isCube ) {
var renderTargetProperties = properties.get( renderTarget ); var textureProperties = properties.get( renderTarget.texture );
_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + renderTarget.activeCubeFace, renderTargetProperties.__webglTexture, 0 ); _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 ) { ...@@ -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.' ); console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' );
return; 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.' ); console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' );
return; return;
...@@ -3205,7 +3216,7 @@ THREE.WebGLRenderer = function ( parameters ) { ...@@ -3205,7 +3216,7 @@ THREE.WebGLRenderer = function ( parameters ) {
if ( _gl.checkFramebufferStatus( _gl.FRAMEBUFFER ) === _gl.FRAMEBUFFER_COMPLETE ) { 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 { } else {
...@@ -3226,7 +3237,7 @@ THREE.WebGLRenderer = function ( parameters ) { ...@@ -3226,7 +3237,7 @@ THREE.WebGLRenderer = function ( parameters ) {
function updateRenderTargetMipmap( renderTarget ) { function updateRenderTargetMipmap( renderTarget ) {
var target = renderTarget instanceof THREE.WebGLRenderTargetCube ? _gl.TEXTURE_CUBE_MAP : _gl.TEXTURE_2D; 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 ); state.bindTexture( target, texture );
_gl.generateMipmap( target ); _gl.generateMipmap( target );
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册