|
@@ -23646,6 +23646,17 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
|
|
|
|
|
|
}
|
|
|
|
|
|
+ if ( glFormat === _gl.RED_INTEGER ) {
|
|
|
+
|
|
|
+ if ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.R8UI;
|
|
|
+ if ( glType === _gl.UNSIGNED_SHORT ) internalFormat = _gl.R16UI;
|
|
|
+ if ( glType === _gl.UNSIGNED_INT ) internalFormat = _gl.R32UI;
|
|
|
+ if ( glType === _gl.BYTE ) internalFormat = _gl.R8I;
|
|
|
+ if ( glType === _gl.SHORT ) internalFormat = _gl.R16I;
|
|
|
+ if ( glType === _gl.INT ) internalFormat = _gl.R32I;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
if ( glFormat === _gl.RG ) {
|
|
|
|
|
|
if ( glType === _gl.FLOAT ) internalFormat = _gl.RG32F;
|
|
@@ -23822,14 +23833,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 );
|
|
|
|
|
@@ -24804,7 +24833,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 );
|
|
@@ -24813,13 +24842,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 );
|
|
|
|
|
|
}
|
|
|
|
|
@@ -24833,7 +24865,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 );
|
|
|
|
|
|
}
|
|
|
|
|
@@ -25054,7 +25086,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 );
|
|
|
|
|
|
}
|
|
|
|
|
@@ -25101,13 +25133,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 ) {
|
|
|
|
|
@@ -25187,7 +25247,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 );
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|
|
@@ -25210,7 +25282,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 ) ) {
|
|
|
|
|
@@ -25242,7 +25314,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 ) ) {
|
|
|
|
|
@@ -29987,7 +30072,16 @@ 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 ) {
|
|
@@ -29996,7 +30090,15 @@ class WebGLRenderer {
|
|
|
|
|
|
} else {
|
|
|
|
|
|
- framebuffer = __webglFramebuffer;
|
|
|
+ if ( Array.isArray( __webglFramebuffer ) ) {
|
|
|
+
|
|
|
+ framebuffer = __webglFramebuffer[ activeMipmapLevel ];
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ framebuffer = __webglFramebuffer;
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|