|
|
@@ -2627,19 +2627,42 @@ class WebGLRenderer {
|
|
|
_gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, minX );
|
|
|
_gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, minY );
|
|
|
|
|
|
- if ( srcTexture.isDataTexture ) {
|
|
|
+ if ( srcTexture.isRenderTargetTexture || srcTexture.isDepthTexture ) {
|
|
|
|
|
|
- _gl.texSubImage2D( _gl.TEXTURE_2D, level, dstX, dstY, width, height, glFormat, glType, image.data );
|
|
|
+ const srcTextureProperties = properties.get( srcTexture );
|
|
|
+ const dstTextureProperties = properties.get( dstTexture );
|
|
|
+ const srcRenderTargetProperties = properties.get( srcTextureProperties.__renderTarget );
|
|
|
+ const dstRenderTargetProperties = properties.get( dstTextureProperties.__renderTarget );
|
|
|
+
|
|
|
+ state.bindFramebuffer( _gl.READ_FRAMEBUFFER, srcRenderTargetProperties.__webglFramebuffer );
|
|
|
+ state.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, dstRenderTargetProperties.__webglFramebuffer );
|
|
|
+
|
|
|
+ let mask = _gl.COLOR_BUFFER_BIT;
|
|
|
+
|
|
|
+ if ( srcTexture.isDepthTexture ) mask = _gl.DEPTH_BUFFER_BIT;
|
|
|
+
|
|
|
+ _gl.blitFramebuffer( minX, minY, width, height, dstX, dstY, width, height, mask, _gl.NEAREST );
|
|
|
+
|
|
|
+ state.bindFramebuffer( _gl.READ_FRAMEBUFFER, null );
|
|
|
+ state.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, null );
|
|
|
|
|
|
} else {
|
|
|
|
|
|
- if ( srcTexture.isCompressedTexture ) {
|
|
|
+ if ( srcTexture.isDataTexture ) {
|
|
|
|
|
|
- _gl.compressedTexSubImage2D( _gl.TEXTURE_2D, level, dstX, dstY, image.width, image.height, glFormat, image.data );
|
|
|
+ _gl.texSubImage2D( _gl.TEXTURE_2D, level, dstX, dstY, width, height, glFormat, glType, image.data );
|
|
|
|
|
|
} else {
|
|
|
|
|
|
- _gl.texSubImage2D( _gl.TEXTURE_2D, level, dstX, dstY, width, height, glFormat, glType, image );
|
|
|
+ if ( srcTexture.isCompressedTexture ) {
|
|
|
+
|
|
|
+ _gl.compressedTexSubImage2D( _gl.TEXTURE_2D, level, dstX, dstY, image.width, image.height, glFormat, image.data );
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ _gl.texSubImage2D( _gl.TEXTURE_2D, level, dstX, dstY, width, height, glFormat, glType, image );
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|
|
|
@@ -2748,19 +2771,47 @@ class WebGLRenderer {
|
|
|
_gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, minY );
|
|
|
_gl.pixelStorei( _gl.UNPACK_SKIP_IMAGES, minZ );
|
|
|
|
|
|
- if ( srcTexture.isDataTexture || srcTexture.isData3DTexture ) {
|
|
|
+ if ( srcTexture.isRenderTargetTexture || srcTexture.isDepthTexture ) {
|
|
|
+
|
|
|
+ const srcTextureProperties = properties.get( srcTexture );
|
|
|
+ const dstTextureProperties = properties.get( dstTexture );
|
|
|
+ const srcRenderTargetProperties = properties.get( srcTextureProperties.__renderTarget );
|
|
|
+ const dstRenderTargetProperties = properties.get( dstTextureProperties.__renderTarget );
|
|
|
+
|
|
|
+ state.bindFramebuffer( _gl.READ_FRAMEBUFFER, srcRenderTargetProperties.__webglFramebuffer );
|
|
|
|
|
|
- _gl.texSubImage3D( glTarget, level, dstX, dstY, dstZ, width, height, depth, glFormat, glType, image.data );
|
|
|
+ _gl.framebufferTextureLayer( _gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, properties.get( srcTexture ).__webglTexture, level, 0 );
|
|
|
+
|
|
|
+ state.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, dstRenderTargetProperties.__webglFramebuffer );
|
|
|
+
|
|
|
+ _gl.framebufferTextureLayer( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, properties.get( dstTexture ).__webglTexture, level, 0 );
|
|
|
+
|
|
|
+ let mask = _gl.COLOR_BUFFER_BIT;
|
|
|
+
|
|
|
+ if ( srcTexture.isDepthTexture ) mask = _gl.DEPTH_BUFFER_BIT;
|
|
|
+
|
|
|
+ _gl.blitFramebuffer( minX, minY, width, height, dstX, dstY, width, height, mask, _gl.NEAREST );
|
|
|
+
|
|
|
+ state.bindFramebuffer( _gl.READ_FRAMEBUFFER, null );
|
|
|
+ state.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, null );
|
|
|
|
|
|
} else {
|
|
|
|
|
|
- if ( dstTexture.isCompressedArrayTexture ) {
|
|
|
+ if ( srcTexture.isDataTexture || srcTexture.isData3DTexture ) {
|
|
|
|
|
|
- _gl.compressedTexSubImage3D( glTarget, level, dstX, dstY, dstZ, width, height, depth, glFormat, image.data );
|
|
|
+ _gl.texSubImage3D( glTarget, level, dstX, dstY, dstZ, width, height, depth, glFormat, glType, image.data );
|
|
|
|
|
|
} else {
|
|
|
|
|
|
- _gl.texSubImage3D( glTarget, level, dstX, dstY, dstZ, width, height, depth, glFormat, glType, image );
|
|
|
+ if ( dstTexture.isCompressedArrayTexture ) {
|
|
|
+
|
|
|
+ _gl.compressedTexSubImage3D( glTarget, level, dstX, dstY, dstZ, width, height, depth, glFormat, image.data );
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ _gl.texSubImage3D( glTarget, level, dstX, dstY, dstZ, width, height, depth, glFormat, glType, image );
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|