updateMultisampleRenderTarget method
void
updateMultisampleRenderTarget(
- RenderTarget renderTarget
)
Implementation
void updateMultisampleRenderTarget(RenderTarget renderTarget) {
if ( renderTarget.samples > 0 ) {
if ( !useMultisampledRTT( renderTarget )) {
final textures = renderTarget.textures;
final width = renderTarget.width;
final height = renderTarget.height;
int mask = WebGL.COLOR_BUFFER_BIT;
final depthStyle = renderTarget.stencilBuffer ? WebGL.DEPTH_STENCIL_ATTACHMENT : WebGL.DEPTH_ATTACHMENT;
final renderTargetProperties = properties.get( renderTarget );
final isMultipleRenderTargets = ( textures.length > 1 );
// If MRT we need to remove FBO attachments
if ( isMultipleRenderTargets ) {
for (int i = 0; i < textures.length; i ++ ) {
state.bindFramebuffer( WebGL.FRAMEBUFFER, renderTargetProperties['__webglMultisampledFramebuffer'] );
_gl.framebufferRenderbuffer( WebGL.FRAMEBUFFER, WebGL.COLOR_ATTACHMENT0 + i, WebGL.RENDERBUFFER, null );
state.bindFramebuffer( WebGL.FRAMEBUFFER, renderTargetProperties['__webglFramebuffer'] );
_gl.framebufferTexture2D( WebGL.DRAW_FRAMEBUFFER, WebGL.COLOR_ATTACHMENT0 + i, WebGL.TEXTURE_2D, null, 0 );
}
}
state.bindFramebuffer( WebGL.READ_FRAMEBUFFER, renderTargetProperties['__webglMultisampledFramebuffer'] );
state.bindFramebuffer( WebGL.DRAW_FRAMEBUFFER, renderTargetProperties['__webglFramebuffer'] );
for (int i = 0; i < textures.length; i ++ ) {
if ( renderTarget.resolveDepthBuffer ) {
if ( renderTarget.depthBuffer ) mask |= WebGL.DEPTH_BUFFER_BIT;
if ( renderTarget.stencilBuffer && renderTarget.resolveStencilBuffer ) mask |= WebGL.STENCIL_BUFFER_BIT;
}
if ( isMultipleRenderTargets ) {
_gl.framebufferRenderbuffer( WebGL.READ_FRAMEBUFFER, WebGL.COLOR_ATTACHMENT0, WebGL.RENDERBUFFER, renderTargetProperties['__webglColorRenderbuffer'][ i ] );
final webglTexture = properties.get( textures[ i ] )['__webglTexture'];
_gl.framebufferTexture2D( WebGL.DRAW_FRAMEBUFFER, WebGL.COLOR_ATTACHMENT0, WebGL.TEXTURE_2D, webglTexture, 0 );
}
_gl.blitFramebuffer( 0, 0, width, height, 0, 0, width, height, mask, WebGL.NEAREST );
if ( supportsInvalidateFramebuffer) {
invalidationArrayRead.length = 0;
invalidationArrayDraw.length = 0;
invalidationArrayRead.add( WebGL.COLOR_ATTACHMENT0 + i );
if ( renderTarget.depthBuffer && !renderTarget.resolveDepthBuffer) {
invalidationArrayRead.add( depthStyle );
invalidationArrayDraw.add( depthStyle );
_gl.invalidateFramebuffer( WebGL.DRAW_FRAMEBUFFER, invalidationArrayDraw );
}
_gl.invalidateFramebuffer( WebGL.READ_FRAMEBUFFER, invalidationArrayRead );
}
}
state.bindFramebuffer( WebGL.READ_FRAMEBUFFER, null );
state.bindFramebuffer( WebGL.DRAW_FRAMEBUFFER, null );
// If MRT since pre-blit we removed the FBO we need to reconstruct the attachments
if ( isMultipleRenderTargets ) {
for (int i = 0; i < textures.length; i ++ ) {
state.bindFramebuffer( WebGL.FRAMEBUFFER, renderTargetProperties['__webglMultisampledFramebuffer'] );
_gl.framebufferRenderbuffer( WebGL.FRAMEBUFFER, WebGL.COLOR_ATTACHMENT0 + i, WebGL.RENDERBUFFER, renderTargetProperties['__webglColorRenderbuffer'][ i ] );
final webglTexture = properties.get( textures[ i ] )['__webglTexture'];
state.bindFramebuffer( WebGL.FRAMEBUFFER, renderTargetProperties['__webglFramebuffer'] );
_gl.framebufferTexture2D( WebGL.DRAW_FRAMEBUFFER, WebGL.COLOR_ATTACHMENT0 + i, WebGL.TEXTURE_2D, webglTexture, 0 );
}
}
state.bindFramebuffer( WebGL.DRAW_FRAMEBUFFER, renderTargetProperties['__webglMultisampledFramebuffer'] );
} else {
if ( renderTarget.depthBuffer && !renderTarget.resolveDepthBuffer && supportsInvalidateFramebuffer ) {
final depthStyle = renderTarget.stencilBuffer ? WebGL.DEPTH_STENCIL_ATTACHMENT : WebGL.DEPTH_ATTACHMENT;
_gl.invalidateFramebuffer( WebGL.DRAW_FRAMEBUFFER, [ depthStyle ] );
}
}
}
}