|
@@ -343,7 +343,17 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
|
|
|
_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer );
|
|
|
if ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer );
|
|
|
if ( renderTargetProperties.__webglMultisampledFramebuffer ) _gl.deleteFramebuffer( renderTargetProperties.__webglMultisampledFramebuffer );
|
|
|
- if ( renderTargetProperties.__webglColorRenderbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglColorRenderbuffer );
|
|
|
+
|
|
|
+ if ( renderTargetProperties.__webglColorRenderbuffer ) {
|
|
|
+
|
|
|
+ for ( let i = 0; i < renderTargetProperties.__webglColorRenderbuffer.length; i ++ ) {
|
|
|
+
|
|
|
+ if ( renderTargetProperties.__webglColorRenderbuffer[ i ] ) _gl.deleteRenderbuffer( renderTargetProperties.__webglColorRenderbuffer[ i ] );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
if ( renderTargetProperties.__webglDepthRenderbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthRenderbuffer );
|
|
|
|
|
|
}
|
|
@@ -1338,25 +1348,30 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
|
|
|
|
|
|
} else {
|
|
|
|
|
|
- // Use the first texture for MRT so far
|
|
|
- const texture = renderTarget.isWebGLMultipleRenderTargets === true ? renderTarget.texture[ 0 ] : renderTarget.texture;
|
|
|
+ const textures = renderTarget.isWebGLMultipleRenderTargets === true ? renderTarget.texture : [ renderTarget.texture ];
|
|
|
|
|
|
- const glFormat = utils.convert( texture.format, texture.encoding );
|
|
|
- const glType = utils.convert( texture.type );
|
|
|
- const glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );
|
|
|
- const samples = getRenderTargetSamples( renderTarget );
|
|
|
+ for ( let i = 0; i < textures.length; i ++ ) {
|
|
|
|
|
|
- if ( isMultisample && useMultisampledRTT( renderTarget ) === false ) {
|
|
|
+ const texture = textures[ i ];
|
|
|
|
|
|
- _gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );
|
|
|
+ const glFormat = utils.convert( texture.format, texture.encoding );
|
|
|
+ const glType = utils.convert( texture.type );
|
|
|
+ const glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );
|
|
|
+ const samples = getRenderTargetSamples( renderTarget );
|
|
|
|
|
|
- } else if ( useMultisampledRTT( renderTarget ) ) {
|
|
|
+ if ( isMultisample && useMultisampledRTT( renderTarget ) === false ) {
|
|
|
+
|
|
|
+ _gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );
|
|
|
|
|
|
- multisampledRTTExt.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );
|
|
|
+ } else if ( useMultisampledRTT( renderTarget ) ) {
|
|
|
|
|
|
- } else {
|
|
|
+ multisampledRTTExt.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );
|
|
|
|
|
|
- _gl.renderbufferStorage( _gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height );
|
|
|
+ } else {
|
|
|
+
|
|
|
+ _gl.renderbufferStorage( _gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height );
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|
|
@@ -1556,21 +1571,34 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
|
|
|
|
|
|
}
|
|
|
|
|
|
- } else if ( ( isWebGL2 && renderTarget.samples > 0 ) && useMultisampledRTT( renderTarget ) === false ) {
|
|
|
+ }
|
|
|
|
|
|
- renderTargetProperties.__webglMultisampledFramebuffer = _gl.createFramebuffer();
|
|
|
- renderTargetProperties.__webglColorRenderbuffer = _gl.createRenderbuffer();
|
|
|
+ if ( ( isWebGL2 && renderTarget.samples > 0 ) && useMultisampledRTT( renderTarget ) === false ) {
|
|
|
|
|
|
- _gl.bindRenderbuffer( _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer );
|
|
|
+ const textures = isMultipleRenderTargets ? texture : [ texture ];
|
|
|
|
|
|
- const glFormat = utils.convert( texture.format, texture.encoding );
|
|
|
- const glType = utils.convert( texture.type );
|
|
|
- const glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );
|
|
|
- const samples = getRenderTargetSamples( renderTarget );
|
|
|
- _gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );
|
|
|
+ renderTargetProperties.__webglMultisampledFramebuffer = _gl.createFramebuffer();
|
|
|
+ renderTargetProperties.__webglColorRenderbuffer = [];
|
|
|
|
|
|
state.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );
|
|
|
- _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer );
|
|
|
+
|
|
|
+ for ( let i = 0; i < textures.length; i ++ ) {
|
|
|
+
|
|
|
+ const texture = textures[ i ];
|
|
|
+ renderTargetProperties.__webglColorRenderbuffer[ i ] = _gl.createRenderbuffer();
|
|
|
+
|
|
|
+ _gl.bindRenderbuffer( _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );
|
|
|
+
|
|
|
+ const glFormat = utils.convert( texture.format, texture.encoding );
|
|
|
+ const glType = utils.convert( texture.type );
|
|
|
+ const glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );
|
|
|
+ const samples = getRenderTargetSamples( renderTarget );
|
|
|
+ _gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );
|
|
|
+
|
|
|
+ _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );
|
|
|
|
|
|
if ( renderTarget.depthBuffer ) {
|
|
@@ -1701,47 +1729,103 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
|
|
|
|
|
|
if ( ( isWebGL2 && renderTarget.samples > 0 ) && useMultisampledRTT( renderTarget ) === false ) {
|
|
|
|
|
|
+ const textures = renderTarget.isWebGLMultipleRenderTargets ? renderTarget.texture : [ renderTarget.texture ];
|
|
|
const width = renderTarget.width;
|
|
|
const height = renderTarget.height;
|
|
|
let mask = _gl.COLOR_BUFFER_BIT;
|
|
|
- const invalidationArray = [ _gl.COLOR_ATTACHMENT0 ];
|
|
|
+ const invalidationArray = [];
|
|
|
const depthStyle = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;
|
|
|
+ const renderTargetProperties = properties.get( renderTarget );
|
|
|
+ const isMultipleRenderTargets = ( renderTarget.isWebGLMultipleRenderTargets === true );
|
|
|
|
|
|
- if ( renderTarget.depthBuffer ) {
|
|
|
-
|
|
|
- invalidationArray.push( depthStyle );
|
|
|
+ // If MRT we need to remove FBO attachments
|
|
|
+ if ( isMultipleRenderTargets ) {
|
|
|
|
|
|
- }
|
|
|
+ for ( let i = 0; i < textures.length; i ++ ) {
|
|
|
|
|
|
- const renderTargetProperties = properties.get( renderTarget );
|
|
|
- const ignoreDepthValues = ( renderTargetProperties.__ignoreDepthValues !== undefined ) ? renderTargetProperties.__ignoreDepthValues : false;
|
|
|
+ state.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );
|
|
|
+ _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, null );
|
|
|
|
|
|
- if ( ignoreDepthValues === false ) {
|
|
|
+ state.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );
|
|
|
+ _gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, null, 0 );
|
|
|
|
|
|
- if ( renderTarget.depthBuffer ) mask |= _gl.DEPTH_BUFFER_BIT;
|
|
|
- if ( renderTarget.stencilBuffer ) mask |= _gl.STENCIL_BUFFER_BIT;
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|
|
|
state.bindFramebuffer( _gl.READ_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );
|
|
|
state.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );
|
|
|
|
|
|
- if ( ignoreDepthValues === true ) {
|
|
|
+ for ( let i = 0; i < textures.length; i ++ ) {
|
|
|
|
|
|
- _gl.invalidateFramebuffer( _gl.READ_FRAMEBUFFER, [ depthStyle ] );
|
|
|
- _gl.invalidateFramebuffer( _gl.DRAW_FRAMEBUFFER, [ depthStyle ] );
|
|
|
+ invalidationArray.push( _gl.COLOR_ATTACHMENT0 + i );
|
|
|
|
|
|
- }
|
|
|
+ if ( renderTarget.depthBuffer ) {
|
|
|
+
|
|
|
+ invalidationArray.push( depthStyle );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ const ignoreDepthValues = ( renderTargetProperties.__ignoreDepthValues !== undefined ) ? renderTargetProperties.__ignoreDepthValues : false;
|
|
|
|
|
|
- _gl.blitFramebuffer( 0, 0, width, height, 0, 0, width, height, mask, _gl.NEAREST );
|
|
|
+ if ( ignoreDepthValues === false ) {
|
|
|
|
|
|
- if ( supportsInvalidateFramebuffer ) {
|
|
|
+ if ( renderTarget.depthBuffer ) mask |= _gl.DEPTH_BUFFER_BIT;
|
|
|
+ if ( renderTarget.stencilBuffer ) mask |= _gl.STENCIL_BUFFER_BIT;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if ( isMultipleRenderTargets ) {
|
|
|
+
|
|
|
+ _gl.framebufferRenderbuffer( _gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if ( ignoreDepthValues === true ) {
|
|
|
+
|
|
|
+ _gl.invalidateFramebuffer( _gl.READ_FRAMEBUFFER, [ depthStyle ] );
|
|
|
+ _gl.invalidateFramebuffer( _gl.DRAW_FRAMEBUFFER, [ depthStyle ] );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if ( isMultipleRenderTargets ) {
|
|
|
+
|
|
|
+ const webglTexture = properties.get( textures[ i ] ).__webglTexture;
|
|
|
+ _gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, webglTexture, 0 );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ _gl.blitFramebuffer( 0, 0, width, height, 0, 0, width, height, mask, _gl.NEAREST );
|
|
|
+
|
|
|
+ if ( supportsInvalidateFramebuffer ) {
|
|
|
+
|
|
|
+ _gl.invalidateFramebuffer( _gl.READ_FRAMEBUFFER, invalidationArray );
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
- _gl.invalidateFramebuffer( _gl.READ_FRAMEBUFFER, invalidationArray );
|
|
|
|
|
|
}
|
|
|
|
|
|
state.bindFramebuffer( _gl.READ_FRAMEBUFFER, null );
|
|
|
+ state.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, null );
|
|
|
+
|
|
|
+ // If MRT since pre-blit we removed the FBO we need to reconstruct the attachments
|
|
|
+ if ( isMultipleRenderTargets ) {
|
|
|
+
|
|
|
+ for ( let i = 0; i < textures.length; i ++ ) {
|
|
|
+
|
|
|
+ state.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );
|
|
|
+ _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );
|
|
|
+
|
|
|
+ const webglTexture = properties.get( textures[ i ] ).__webglTexture;
|
|
|
+
|
|
|
+ state.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );
|
|
|
+ _gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, webglTexture, 0 );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
state.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );
|
|
|
|
|
|
}
|