|
@@ -344,14 +344,32 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
|
|
|
|
|
|
for ( let i = 0; i < 6; i ++ ) {
|
|
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 ] );
|
|
if ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] );
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
} else {
|
|
} 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.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer );
|
|
if ( renderTargetProperties.__webglMultisampledFramebuffer ) _gl.deleteFramebuffer( renderTargetProperties.__webglMultisampledFramebuffer );
|
|
if ( renderTargetProperties.__webglMultisampledFramebuffer ) _gl.deleteFramebuffer( renderTargetProperties.__webglMultisampledFramebuffer );
|
|
|
|
|
|
@@ -1326,7 +1344,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
|
|
// Render targets
|
|
// Render targets
|
|
|
|
|
|
// Setup storage for target texture and bind it to correct framebuffer
|
|
// 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 glFormat = utils.convert( texture.format, texture.colorSpace );
|
|
const glType = utils.convert( texture.type );
|
|
const glType = utils.convert( texture.type );
|
|
@@ -1335,13 +1353,16 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
|
|
|
|
|
|
if ( ! renderTargetProperties.__hasExternalTextures ) {
|
|
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 ) {
|
|
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 {
|
|
} 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 );
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1355,7 +1376,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
|
|
} 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 );
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1576,7 +1597,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
|
|
|
|
|
|
if ( colorTexture !== undefined ) {
|
|
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 );
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1623,13 +1644,41 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
|
|
|
|
|
|
for ( let i = 0; i < 6; i ++ ) {
|
|
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 {
|
|
} 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 ) {
|
|
if ( isMultipleRenderTargets ) {
|
|
|
|
|
|
@@ -1709,7 +1758,19 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
|
|
|
|
|
|
for ( let i = 0; i < 6; i ++ ) {
|
|
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 );
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1732,7 +1793,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
|
|
|
|
|
|
state.bindTexture( _gl.TEXTURE_2D, attachmentProperties.__webglTexture );
|
|
state.bindTexture( _gl.TEXTURE_2D, attachmentProperties.__webglTexture );
|
|
setTextureParameters( _gl.TEXTURE_2D, attachment, supportsMips );
|
|
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 ) ) {
|
|
if ( textureNeedsGenerateMipmaps( attachment, supportsMips ) ) {
|
|
|
|
|
|
@@ -1764,7 +1825,20 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
|
|
|
|
|
|
state.bindTexture( glTextureType, textureProperties.__webglTexture );
|
|
state.bindTexture( glTextureType, textureProperties.__webglTexture );
|
|
setTextureParameters( glTextureType, texture, supportsMips );
|
|
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 ) ) {
|
|
if ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {
|
|
|
|
|