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 + + + + + + + + + + + + + + +
+ + three.js + + - 3D texture framebuffer MRT color attachments +
+ + Scanned head data by + Divine Augustine
+ licensed under + CPOL +
+ + + + + + 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 ++ ) {