Skip to content
7 changes: 5 additions & 2 deletions src/renderers/WebGLRenderer.js
Original file line number Diff line number Diff line change
Expand Up @@ -2097,7 +2097,9 @@ class WebGLRenderer {

if ( renderTarget.isWebGLCubeRenderTarget ) {

framebuffer = __webglFramebuffer[ activeCubeFace ];
if ( Array.isArray( __webglFramebuffer[ activeCubeFace ] ) ) framebuffer = __webglFramebuffer[ activeCubeFace ][ activeMipmapLevel ];
else framebuffer = __webglFramebuffer[ activeCubeFace ];

isCube = true;

} else if ( ( capabilities.isWebGL2 && renderTarget.samples > 0 ) && textures.useMultisampledRTT( renderTarget ) === false ) {
Expand All @@ -2106,7 +2108,8 @@ class WebGLRenderer {

} else {

framebuffer = __webglFramebuffer;
if ( Array.isArray( __webglFramebuffer ) ) framebuffer = __webglFramebuffer[ activeMipmapLevel ];
else framebuffer = __webglFramebuffer;

}

Expand Down
98 changes: 86 additions & 12 deletions src/renderers/webgl/WebGLTextures.js
Original file line number Diff line number Diff line change
Expand Up @@ -333,14 +333,32 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,

for ( let i = 0; i < 6; i ++ ) {

_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] );
if ( Array.isArray( renderTargetProperties.__webglFramebuffer[ i ] ) ) {

for ( let level = 0; level < renderTargetProperties.__webglFramebuffer[ i ].length; level ++ ) _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ][ level ] );

} else {

_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] );

}

if ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] );

}

} else {

_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer );
if ( Array.isArray( renderTargetProperties.__webglFramebuffer ) ) {

for ( let level = 0; level < renderTargetProperties.__webglFramebuffer.length; level ++ ) _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ level ] );

} else {

_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer );

}

if ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer );
if ( renderTargetProperties.__webglMultisampledFramebuffer ) _gl.deleteFramebuffer( renderTargetProperties.__webglMultisampledFramebuffer );

Expand Down Expand Up @@ -1315,7 +1333,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
// Render targets

// Setup storage for target texture and bind it to correct framebuffer
function setupFrameBufferTexture( framebuffer, renderTarget, texture, attachment, textureTarget ) {
function setupFrameBufferTexture( framebuffer, renderTarget, texture, attachment, textureTarget, level ) {

const glFormat = utils.convert( texture.format, texture.colorSpace );
const glType = utils.convert( texture.type );
Expand All @@ -1324,13 +1342,16 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,

if ( ! renderTargetProperties.__hasExternalTextures ) {

const width = Math.max( 1, renderTarget.width >> level );
const height = Math.max( 1, renderTarget.height >> level );

if ( textureTarget === _gl.TEXTURE_3D || textureTarget === _gl.TEXTURE_2D_ARRAY ) {

state.texImage3D( textureTarget, 0, glInternalFormat, renderTarget.width, renderTarget.height, renderTarget.depth, 0, glFormat, glType, null );
state.texImage3D( textureTarget, level, glInternalFormat, width, height, renderTarget.depth, 0, glFormat, glType, null );

} else {

state.texImage2D( textureTarget, 0, glInternalFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );
state.texImage2D( textureTarget, level, glInternalFormat, width, height, 0, glFormat, glType, null );

}

Expand All @@ -1344,7 +1365,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,

} else if ( textureTarget === _gl.TEXTURE_2D || ( textureTarget >= _gl.TEXTURE_CUBE_MAP_POSITIVE_X && textureTarget <= _gl.TEXTURE_CUBE_MAP_NEGATIVE_Z ) ) { // see #24753

_gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( texture ).__webglTexture, 0 );
_gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( texture ).__webglTexture, level );

}

Expand Down Expand Up @@ -1565,7 +1586,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,

if ( colorTexture !== undefined ) {

setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, renderTarget.texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D );
setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, renderTarget.texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, 0 );

}

Expand Down Expand Up @@ -1612,13 +1633,41 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,

for ( let i = 0; i < 6; i ++ ) {

renderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer();
if ( isWebGL2 && texture.mipmaps && texture.mipmaps.length > 0 ) {

renderTargetProperties.__webglFramebuffer[ i ] = [];

for ( let level = 0; level < texture.mipmaps.length; level ++ ) {

renderTargetProperties.__webglFramebuffer[ i ][ level ] = _gl.createFramebuffer();

}

} else {

renderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer();

}

}

} else {

renderTargetProperties.__webglFramebuffer = _gl.createFramebuffer();
if ( isWebGL2 && texture.mipmaps && texture.mipmaps.length > 0 ) {

renderTargetProperties.__webglFramebuffer = [];

for ( let level = 0; level < texture.mipmaps.length; level ++ ) {

renderTargetProperties.__webglFramebuffer[ level ] = _gl.createFramebuffer();

}

} else {

renderTargetProperties.__webglFramebuffer = _gl.createFramebuffer();

}

if ( isMultipleRenderTargets ) {

Expand Down Expand Up @@ -1698,7 +1747,19 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,

for ( let i = 0; i < 6; i ++ ) {

setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i );
if ( isWebGL2 && texture.mipmaps && texture.mipmaps.length > 0 ) {

for ( let level = 0; level < texture.mipmaps.length; level ++ ) {

setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ][ level ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, level );

}

} else {

setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0 );

}

}

Expand All @@ -1721,7 +1782,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,

state.bindTexture( _gl.TEXTURE_2D, attachmentProperties.__webglTexture );
setTextureParameters( _gl.TEXTURE_2D, attachment, supportsMips );
setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, attachment, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D );
setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, attachment, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, 0 );

if ( textureNeedsGenerateMipmaps( attachment, supportsMips ) ) {

Expand Down Expand Up @@ -1753,7 +1814,20 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,

state.bindTexture( glTextureType, textureProperties.__webglTexture );
setTextureParameters( glTextureType, texture, supportsMips );
setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, texture, _gl.COLOR_ATTACHMENT0, glTextureType );

if ( isWebGL2 && texture.mipmaps && texture.mipmaps.length > 0 ) {

for ( let level = 0; level < texture.mipmaps.length; level ++ ) {

setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ level ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, glTextureType, level );

}

} else {

setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, texture, _gl.COLOR_ATTACHMENT0, glTextureType, 0 );

}

if ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {

Expand Down