diff --git a/examples/files.json b/examples/files.json
index 4690f643307c29..a977d6bd95bcc4 100644
--- a/examples/files.json
+++ b/examples/files.json
@@ -276,6 +276,7 @@
"webgl_multiple_rendertargets",
"webgl_multisampled_renderbuffers",
"webgl_rendertarget_texture2darray",
+ "webgl_rendertarget_texture3D_mrt",
"webgl_shadowmap_csm",
"webgl_shadowmap_pcss",
"webgl_shadowmap_progressive",
diff --git a/examples/screenshots/webgl_rendertarget_texture3D_mrt.jpg b/examples/screenshots/webgl_rendertarget_texture3D_mrt.jpg
new file mode 100644
index 00000000000000..de40e3514ab858
Binary files /dev/null and b/examples/screenshots/webgl_rendertarget_texture3D_mrt.jpg differ
diff --git a/examples/tags.json b/examples/tags.json
index b103ba8298fd06..d440012482a693 100644
--- a/examples/tags.json
+++ b/examples/tags.json
@@ -103,6 +103,7 @@
"webgl_materials_modified": [ "onBeforeCompile" ],
"webgl_raycaster_bvh": [ "external", "query", "bounds", "tree", "accelerate", "performance", "community", "extension", "plugin", "library", "three-mesh-bvh" ],
"webgl_renderer_pathtracer": [ "external", "raytracing", "pathtracing", "library", "plugin", "extension", "community", "three-gpu-pathtracer", "three-mesh-bvh" ],
+ "webgl_rendertarget_texture3D_mrt": [ "mrt", "renderTarget"],
"webgpu_compute_particles_snow": [ "external", "webgpu", "stats-gl" ],
"webgl_shadowmap_csm": [ "cascade" ],
"webgl_shadowmap_pcss": [ "soft" ],
diff --git a/examples/webgl_rendertarget_texture3D_mrt.html b/examples/webgl_rendertarget_texture3D_mrt.html
new file mode 100644
index 00000000000000..34000baf7ee98e
--- /dev/null
+++ b/examples/webgl_rendertarget_texture3D_mrt.html
@@ -0,0 +1,322 @@
+
+
+
+ three.js webgl - 3D texture framebuffer attachment with MRT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/renderers/WebGL3DRenderTarget.js b/src/renderers/WebGL3DRenderTarget.js
index be074da600eed1..998360e71b2e7b 100644
--- a/src/renderers/WebGL3DRenderTarget.js
+++ b/src/renderers/WebGL3DRenderTarget.js
@@ -13,6 +13,8 @@ class WebGL3DRenderTarget extends WebGLRenderTarget {
this.texture = new Data3DTexture( null, width, height, depth );
+ this.textures = this.textures.map( () => this.texture );
+
this.texture.isRenderTargetTexture = true;
}
diff --git a/src/renderers/WebGLArrayRenderTarget.js b/src/renderers/WebGLArrayRenderTarget.js
index 769f9e5e0e79c8..56c929beba2644 100644
--- a/src/renderers/WebGLArrayRenderTarget.js
+++ b/src/renderers/WebGLArrayRenderTarget.js
@@ -13,6 +13,8 @@ class WebGLArrayRenderTarget extends WebGLRenderTarget {
this.texture = new DataArrayTexture( null, width, height, depth );
+ this.textures = this.textures.map( () => this.texture );
+
this.texture.isRenderTargetTexture = true;
}
diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js
index 99f00248376f53..34bc28f11ba4f2 100644
--- a/src/renderers/WebGLRenderer.js
+++ b/src/renderers/WebGLRenderer.js
@@ -2403,9 +2403,15 @@ class WebGLRenderer {
} else if ( isRenderTarget3D ) {
+ const layer = activeCubeFace || 0;
+
const textureProperties = properties.get( renderTarget.texture );
- const layer = activeCubeFace;
- _gl.framebufferTextureLayer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, textureProperties.__webglTexture, activeMipmapLevel, layer );
+
+ for ( let i = 0; i < renderTarget.textures.length; i ++ ) {
+
+ _gl.framebufferTextureLayer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, textureProperties.__webglTexture, activeMipmapLevel || 0, layer + i );
+
+ }
} else if ( renderTarget !== null && activeMipmapLevel !== 0 ) {
diff --git a/src/renderers/webgl/WebGLTextures.js b/src/renderers/webgl/WebGLTextures.js
index b9050ccbc3b78d..1355631aa918c9 100644
--- a/src/renderers/webgl/WebGLTextures.js
+++ b/src/renderers/webgl/WebGLTextures.js
@@ -1717,9 +1717,10 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
const textures = renderTarget.textures;
const isCube = ( renderTarget.isWebGLCubeRenderTarget === true );
+ const is3DRenderTarget = ( renderTarget.isWebGL3DRenderTarget || renderTarget.isWebGLArrayRenderTarget );
const isMultipleRenderTargets = ( textures.length > 1 );
- if ( ! isMultipleRenderTargets ) {
+ if ( ! isMultipleRenderTargets || is3DRenderTarget ) {
if ( textureProperties.__webglTexture === undefined ) {
@@ -1776,7 +1777,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
}
- if ( isMultipleRenderTargets ) {
+ if ( isMultipleRenderTargets && ! is3DRenderTarget ) {
for ( let i = 0, il = textures.length; i < il; i ++ ) {
@@ -1866,7 +1867,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
state.unbindTexture();
- } else if ( isMultipleRenderTargets ) {
+ } else if ( isMultipleRenderTargets && ! is3DRenderTarget ) {
for ( let i = 0, il = textures.length; i < il; i ++ ) {