From e76de9cbeeedc037a4476ba8e720be1dacfd3279 Mon Sep 17 00:00:00 2001 From: "Mr.doob" Date: Mon, 8 Dec 2025 01:45:29 +0900 Subject: [PATCH 01/18] WebGLRenderer: Add colorBufferType and setEffects(). --- examples/jsm/postprocessing/RenderPass.js | 10 + src/renderers/WebGLRenderer.js | 102 +++++++-- src/renderers/webgl/WebGLOutputBuffer.js | 244 ++++++++++++++++++++++ 3 files changed, 335 insertions(+), 21 deletions(-) create mode 100644 src/renderers/webgl/WebGLOutputBuffer.js diff --git a/examples/jsm/postprocessing/RenderPass.js b/examples/jsm/postprocessing/RenderPass.js index c85f0e559a7a78..e8428a1c7ef849 100644 --- a/examples/jsm/postprocessing/RenderPass.js +++ b/examples/jsm/postprocessing/RenderPass.js @@ -93,6 +93,16 @@ class RenderPass extends Pass { * @default false */ this.needsSwap = false; + + /** + * This flag indicates that this pass renders the scene itself. + * + * @type {boolean} + * @readonly + * @default true + */ + this.isRenderPass = true; + this._oldClearColor = new Color(); } diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js index 9cd5b4c43fee84..db94698c9b8092 100644 --- a/src/renderers/WebGLRenderer.js +++ b/src/renderers/WebGLRenderer.js @@ -39,6 +39,7 @@ import { WebGLIndexedBufferRenderer } from './webgl/WebGLIndexedBufferRenderer.j import { WebGLInfo } from './webgl/WebGLInfo.js'; import { WebGLMorphtargets } from './webgl/WebGLMorphtargets.js'; import { WebGLObjects } from './webgl/WebGLObjects.js'; +import { WebGLOutputBuffer } from './webgl/WebGLOutputBuffer.js'; import { WebGLPrograms } from './webgl/WebGLPrograms.js'; import { WebGLProperties } from './webgl/WebGLProperties.js'; import { WebGLRenderLists } from './webgl/WebGLRenderLists.js'; @@ -82,6 +83,7 @@ class WebGLRenderer { powerPreference = 'default', failIfMajorPerformanceCaveat = false, reversedDepthBuffer = false, + colorBufferType = UnsignedByteType, } = parameters; /** @@ -111,6 +113,8 @@ class WebGLRenderer { } + const _colorBufferType = colorBufferType; + const INTEGER_FORMATS = new Set( [ RGBAIntegerFormat, RGIntegerFormat, @@ -138,6 +142,10 @@ class WebGLRenderer { const renderListStack = []; const renderStateStack = []; + // internal render target for non-UnsignedByteType color buffer + + let outputBuffer = null; + // public properties /** @@ -533,6 +541,14 @@ class WebGLRenderer { initGLContext(); + // initialize internal render target for non-UnsignedByteType color buffer + + if ( _colorBufferType !== UnsignedByteType ) { + + outputBuffer = new WebGLOutputBuffer( _colorBufferType, canvas.width, canvas.height, depth, stencil ); + + } + // xr const xr = new WebXRManager( _this, _gl ); @@ -655,6 +671,12 @@ class WebGLRenderer { } + if ( outputBuffer !== null ) { + + outputBuffer.setSize( canvas.width, canvas.height ); + + } + this.setViewport( 0, 0, width, height ); }; @@ -698,6 +720,23 @@ class WebGLRenderer { }; + /** + * Sets the post-processing effects to be applied after rendering. + * + * @param {Array} effects - An array of post-processing effects. + */ + this.setEffects = function ( effects ) { + + if ( outputBuffer === null ) { + + outputBuffer = new WebGLOutputBuffer( _colorBufferType, canvas.width, canvas.height, depth, stencil ); + + } + + outputBuffer.setPasses( effects || [] ); + + }; + /** * Returns the current viewport definition. * @@ -1547,6 +1586,10 @@ class WebGLRenderer { if ( _isContextLost === true ) return; + // use internal render target for HalfFloatType color buffer (only when tone mapping is enabled) + + const useOutputBuffer = outputBuffer !== null && _currentRenderTarget === null && outputBuffer.isCopying() === false && outputBuffer.activate( _this ); + // update scene graph if ( scene.matrixWorldAutoUpdate === true ) scene.updateMatrixWorld(); @@ -1627,46 +1670,52 @@ class WebGLRenderer { if ( this.info.autoReset === true ) this.info.reset(); - // render scene + // render scene (skip if first effect is a render pass - it will render the scene itself) - const opaqueObjects = currentRenderList.opaque; - const transmissiveObjects = currentRenderList.transmissive; + const skipSceneRender = useOutputBuffer && outputBuffer.hasRenderPass(); - currentRenderState.setupLights(); + if ( skipSceneRender === false ) { - if ( camera.isArrayCamera ) { + const opaqueObjects = currentRenderList.opaque; + const transmissiveObjects = currentRenderList.transmissive; - const cameras = camera.cameras; + currentRenderState.setupLights(); - if ( transmissiveObjects.length > 0 ) { + if ( camera.isArrayCamera ) { - for ( let i = 0, l = cameras.length; i < l; i ++ ) { + const cameras = camera.cameras; - const camera2 = cameras[ i ]; + if ( transmissiveObjects.length > 0 ) { + + for ( let i = 0, l = cameras.length; i < l; i ++ ) { - renderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera2 ); + const camera2 = cameras[ i ]; + + renderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera2 ); + + } } - } + if ( _renderBackground ) background.render( scene ); - if ( _renderBackground ) background.render( scene ); + for ( let i = 0, l = cameras.length; i < l; i ++ ) { - for ( let i = 0, l = cameras.length; i < l; i ++ ) { + const camera2 = cameras[ i ]; - const camera2 = cameras[ i ]; + renderScene( currentRenderList, scene, camera2, camera2.viewport ); - renderScene( currentRenderList, scene, camera2, camera2.viewport ); + } - } + } else { - } else { + if ( transmissiveObjects.length > 0 ) renderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera ); - if ( transmissiveObjects.length > 0 ) renderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera ); + if ( _renderBackground ) background.render( scene ); - if ( _renderBackground ) background.render( scene ); + renderScene( currentRenderList, scene, camera ); - renderScene( currentRenderList, scene, camera ); + } } @@ -1684,6 +1733,14 @@ class WebGLRenderer { } + // copy from internal render target to canvas using fullscreen quad + + if ( useOutputBuffer ) { + + outputBuffer.render( _this ); + + } + // if ( scene.isScene === true ) scene.onAfterRender( _this, scene, camera ); @@ -1872,9 +1929,12 @@ class WebGLRenderer { if ( currentRenderState.state.transmissionRenderTarget[ camera.id ] === undefined ) { + const hasHalfFloatSupport = extensions.has( 'EXT_color_buffer_half_float' ) || extensions.has( 'EXT_color_buffer_float' ); + const useHalfFloat = _colorBufferType === HalfFloatType && hasHalfFloatSupport; + currentRenderState.state.transmissionRenderTarget[ camera.id ] = new WebGLRenderTarget( 1, 1, { generateMipmaps: true, - type: ( extensions.has( 'EXT_color_buffer_half_float' ) || extensions.has( 'EXT_color_buffer_float' ) ) ? HalfFloatType : UnsignedByteType, + type: useHalfFloat ? HalfFloatType : UnsignedByteType, minFilter: LinearMipmapLinearFilter, samples: capabilities.samples, stencilBuffer: stencil, diff --git a/src/renderers/webgl/WebGLOutputBuffer.js b/src/renderers/webgl/WebGLOutputBuffer.js new file mode 100644 index 00000000000000..7387c3e3e768f0 --- /dev/null +++ b/src/renderers/webgl/WebGLOutputBuffer.js @@ -0,0 +1,244 @@ +import { + NoToneMapping, + LinearToneMapping, + ReinhardToneMapping, + CineonToneMapping, + ACESFilmicToneMapping, + AgXToneMapping, + NeutralToneMapping, + CustomToneMapping, + SRGBTransfer, + HalfFloatType +} from '../../constants.js'; +import { BufferGeometry } from '../../core/BufferGeometry.js'; +import { Float32BufferAttribute } from '../../core/BufferAttribute.js'; +import { RawShaderMaterial } from '../../materials/RawShaderMaterial.js'; +import { Mesh } from '../../objects/Mesh.js'; +import { OrthographicCamera } from '../../cameras/OrthographicCamera.js'; +import { WebGLRenderTarget } from '../WebGLRenderTarget.js'; +import { ColorManagement } from '../../math/ColorManagement.js'; + +function WebGLOutputBuffer( type, width, height, depth, stencil ) { + + // render targets for scene and post-processing + const renderTargetA = new WebGLRenderTarget( width, height, { + type: type, + depthBuffer: depth, + stencilBuffer: stencil + } ); + + const renderTargetB = new WebGLRenderTarget( width, height, { + type: HalfFloatType, + depthBuffer: false, + stencilBuffer: false + } ); + + // create fullscreen triangle geometry + const geometry = new BufferGeometry(); + geometry.setAttribute( 'position', new Float32BufferAttribute( [ - 1, 3, 0, - 1, - 1, 0, 3, - 1, 0 ], 3 ) ); + geometry.setAttribute( 'uv', new Float32BufferAttribute( [ 0, 2, 0, 0, 2, 0 ], 2 ) ); + + // create output material with tone mapping support + const outputMaterial = new RawShaderMaterial( { + uniforms: { + tDiffuse: { value: null } + }, + vertexShader: /* glsl */` + precision highp float; + + uniform mat4 modelViewMatrix; + uniform mat4 projectionMatrix; + + attribute vec3 position; + attribute vec2 uv; + + varying vec2 vUv; + + void main() { + vUv = uv; + gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 ); + }`, + fragmentShader: /* glsl */` + precision highp float; + + uniform sampler2D tDiffuse; + + varying vec2 vUv; + + #include + #include + + void main() { + gl_FragColor = texture2D( tDiffuse, vUv ); + + #ifdef LINEAR_TONE_MAPPING + gl_FragColor.rgb = LinearToneMapping( gl_FragColor.rgb ); + #elif defined( REINHARD_TONE_MAPPING ) + gl_FragColor.rgb = ReinhardToneMapping( gl_FragColor.rgb ); + #elif defined( CINEON_TONE_MAPPING ) + gl_FragColor.rgb = CineonToneMapping( gl_FragColor.rgb ); + #elif defined( ACES_FILMIC_TONE_MAPPING ) + gl_FragColor.rgb = ACESFilmicToneMapping( gl_FragColor.rgb ); + #elif defined( AGX_TONE_MAPPING ) + gl_FragColor.rgb = AgXToneMapping( gl_FragColor.rgb ); + #elif defined( NEUTRAL_TONE_MAPPING ) + gl_FragColor.rgb = NeutralToneMapping( gl_FragColor.rgb ); + #elif defined( CUSTOM_TONE_MAPPING ) + gl_FragColor.rgb = CustomToneMapping( gl_FragColor.rgb ); + #endif + + #ifdef SRGB_TRANSFER + gl_FragColor = sRGBTransferOETF( gl_FragColor ); + #endif + }`, + depthTest: false, + depthWrite: false + } ); + + const outputMesh = new Mesh( geometry, outputMaterial ); + const outputCamera = new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 ); + + let _outputColorSpace = null; + let _outputToneMapping = null; + let _copyingToCanvas = false; + let _savedToneMapping; + let _passes = []; + let _hasRenderPass = false; + + this.enabled = true; + + this.setSize = function ( width, height ) { + + renderTargetA.setSize( width, height ); + renderTargetB.setSize( width, height ); + + for ( let i = 0; i < _passes.length; i ++ ) { + + const pass = _passes[ i ]; + if ( pass.setSize ) pass.setSize( width, height ); + + } + + }; + + this.setPasses = function ( passes ) { + + _passes = passes; + _hasRenderPass = _passes.length > 0 && _passes[ 0 ].isRenderPass === true; + + const width = renderTargetA.width; + const height = renderTargetA.height; + + for ( let i = 0; i < _passes.length; i ++ ) { + + const pass = _passes[ i ]; + if ( pass.setSize ) pass.setSize( width, height ); + + } + + }; + + this.activate = function ( renderer ) { + + if ( this.enabled === false ) return false; + if ( renderer.toneMapping === NoToneMapping && _passes.length === 0 ) return false; + + // if first pass is a render pass, it will set its own render target + if ( _hasRenderPass === false ) { + + renderer.setRenderTarget( renderTargetA ); + + } + + // disable tone mapping during render - it will be applied when copying to canvas + _savedToneMapping = renderer.toneMapping; + renderer.toneMapping = NoToneMapping; + + return true; + + }; + + this.hasRenderPass = function () { + + return _hasRenderPass; + + }; + + this.render = function ( renderer, deltaTime ) { + + // restore tone mapping + renderer.toneMapping = _savedToneMapping; + + _copyingToCanvas = true; + + // run post-processing passes + let readBuffer = renderTargetA; + let writeBuffer = renderTargetB; + + for ( let i = 0; i < _passes.length; i ++ ) { + + const pass = _passes[ i ]; + + if ( pass.enabled === false ) continue; + + pass.render( renderer, writeBuffer, readBuffer, deltaTime ); + + if ( pass.needsSwap !== false ) { + + const temp = readBuffer; + readBuffer = writeBuffer; + writeBuffer = temp; + + } + + } + + // update output material defines if settings changed + if ( _outputColorSpace !== renderer.outputColorSpace || _outputToneMapping !== renderer.toneMapping ) { + + _outputColorSpace = renderer.outputColorSpace; + _outputToneMapping = renderer.toneMapping; + + outputMaterial.defines = {}; + + if ( ColorManagement.getTransfer( _outputColorSpace ) === SRGBTransfer ) outputMaterial.defines.SRGB_TRANSFER = ''; + + if ( _outputToneMapping === LinearToneMapping ) outputMaterial.defines.LINEAR_TONE_MAPPING = ''; + else if ( _outputToneMapping === ReinhardToneMapping ) outputMaterial.defines.REINHARD_TONE_MAPPING = ''; + else if ( _outputToneMapping === CineonToneMapping ) outputMaterial.defines.CINEON_TONE_MAPPING = ''; + else if ( _outputToneMapping === ACESFilmicToneMapping ) outputMaterial.defines.ACES_FILMIC_TONE_MAPPING = ''; + else if ( _outputToneMapping === AgXToneMapping ) outputMaterial.defines.AGX_TONE_MAPPING = ''; + else if ( _outputToneMapping === NeutralToneMapping ) outputMaterial.defines.NEUTRAL_TONE_MAPPING = ''; + else if ( _outputToneMapping === CustomToneMapping ) outputMaterial.defines.CUSTOM_TONE_MAPPING = ''; + + outputMaterial.needsUpdate = true; + + } + + // final output to canvas + outputMaterial.uniforms.tDiffuse.value = readBuffer.texture; + renderer.setRenderTarget( null ); + renderer.render( outputMesh, outputCamera ); + + _copyingToCanvas = false; + + }; + + this.isCopying = function () { + + return _copyingToCanvas; + + }; + + this.dispose = function () { + + renderTargetA.dispose(); + renderTargetB.dispose(); + geometry.dispose(); + outputMaterial.dispose(); + + }; + +} + +export { WebGLOutputBuffer }; From b47cdb425f16700b6037f78fca2440797df1a990 Mon Sep 17 00:00:00 2001 From: "Mr.doob" Date: Mon, 8 Dec 2025 01:46:12 +0900 Subject: [PATCH 02/18] Updated watch and ldraw examples. --- examples/screenshots/webgl_loader_ldraw.jpg | Bin 49537 -> 48782 bytes examples/webgl_loader_ldraw.html | 2 +- examples/webgl_watch.html | 42 +++++++++----------- 3 files changed, 19 insertions(+), 25 deletions(-) diff --git a/examples/screenshots/webgl_loader_ldraw.jpg b/examples/screenshots/webgl_loader_ldraw.jpg index 2b17a519f19bc71133085563e251842ecb290b2a..54fa76e1c988719588534fd264a56c1f4cd00c0c 100644 GIT binary patch literal 48782 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 W{~40`A2!1O&lB^1n5Jca&HP{9`PX~^ literal 49537 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 K(eJMOock|9y3x=8 diff --git a/examples/webgl_loader_ldraw.html b/examples/webgl_loader_ldraw.html index f6c10569cf5474..63b1713aa72d29 100644 --- a/examples/webgl_loader_ldraw.html +++ b/examples/webgl_loader_ldraw.html @@ -81,7 +81,7 @@ // - renderer = new THREE.WebGLRenderer( { antialias: true } ); + renderer = new THREE.WebGLRenderer( { antialias: true, colorBufferType: THREE.HalfFloatType } ); renderer.setPixelRatio( window.devicePixelRatio ); renderer.setSize( window.innerWidth, window.innerHeight ); renderer.setAnimationLoop( animate ); diff --git a/examples/webgl_watch.html b/examples/webgl_watch.html index 262ab6b9586b8c..490726bd406bd2 100644 --- a/examples/webgl_watch.html +++ b/examples/webgl_watch.html @@ -35,12 +35,10 @@ import { GUI } from 'three/addons/libs/lil-gui.module.min.js'; - import { EffectComposer } from 'three/addons/postprocessing/EffectComposer.js'; import { UnrealBloomPass } from 'three/addons/postprocessing/UnrealBloomPass.js'; - import { OutputPass } from 'three/addons/postprocessing/OutputPass.js'; import { TAARenderPass } from 'three/addons/postprocessing/TAARenderPass.js'; - let composer, camera, scene, renderer; + let camera, scene, renderer; let gui, dirLight, pointLight, controls, bloomPass, taaPass; let ready = false; @@ -69,7 +67,7 @@ scene = new THREE.Scene(); - renderer = new THREE.WebGLRenderer( { antialias: true } ); + renderer = new THREE.WebGLRenderer( { antialias: true, colorBufferType: THREE.HalfFloatType } ); renderer.setPixelRatio( window.devicePixelRatio ); renderer.setSize( window.innerWidth, window.innerHeight ); renderer.setAnimationLoop( animate ); @@ -213,32 +211,27 @@ if ( b ) { - if ( composer ) return; + if ( bloomPass ) return; + + taaPass = new TAARenderPass( scene, camera ); + taaPass.sampleLevel = 2; bloomPass = new UnrealBloomPass( new THREE.Vector2( window.innerWidth, window.innerHeight ), 1.5, 0.4, 0.85 ); bloomPass.threshold = setting.threshold; bloomPass.strength = setting.strength; bloomPass.radius = setting.radius; - taaPass = new TAARenderPass( scene, camera ); - taaPass.sampleLevel = 2; - taaPass.unbiased = false; - - composer = new EffectComposer( renderer ); - composer.setPixelRatio( window.devicePixelRatio ); - composer.setSize( window.innerWidth, window.innerHeight ); - - composer.addPass( taaPass ); - composer.addPass( bloomPass ); - composer.addPass( new OutputPass() ); + renderer.setEffects( [ taaPass, bloomPass ] ); } else { - if ( ! composer ) return; - composer.dispose(); - composer = null; - bloomPass = null; + if ( ! bloomPass ) return; + taaPass.dispose(); taaPass = null; + bloomPass.dispose(); + bloomPass = null; + + renderer.setEffects( null ); } @@ -306,9 +299,11 @@ camera.aspect = width / height; camera.updateProjectionMatrix(); renderer.setSize( width, height ); - if ( composer ) { - composer.setSize( width, height ); + if ( taaPass ) { + + taaPass.setSize( width, height ); + bloomPass.setSize( width, height ); } @@ -322,8 +317,7 @@ TWEEN.update(); - if ( composer ) composer.render(); - else renderer.render( scene, camera ); + renderer.render( scene, camera ); if ( ready ) getTime(); From ec4e2bd42eae52691b8fc35f75011a074eec2a87 Mon Sep 17 00:00:00 2001 From: "Mr.doob" Date: Mon, 8 Dec 2025 02:29:44 +0900 Subject: [PATCH 03/18] WebGLRenderer: Revert transmissionRenderTarget type change. --- src/renderers/WebGLRenderer.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js index db94698c9b8092..b5ae8956ba5000 100644 --- a/src/renderers/WebGLRenderer.js +++ b/src/renderers/WebGLRenderer.js @@ -1930,11 +1930,10 @@ class WebGLRenderer { if ( currentRenderState.state.transmissionRenderTarget[ camera.id ] === undefined ) { const hasHalfFloatSupport = extensions.has( 'EXT_color_buffer_half_float' ) || extensions.has( 'EXT_color_buffer_float' ); - const useHalfFloat = _colorBufferType === HalfFloatType && hasHalfFloatSupport; currentRenderState.state.transmissionRenderTarget[ camera.id ] = new WebGLRenderTarget( 1, 1, { generateMipmaps: true, - type: useHalfFloat ? HalfFloatType : UnsignedByteType, + type: hasHalfFloatSupport ? HalfFloatType : UnsignedByteType, minFilter: LinearMipmapLinearFilter, samples: capabilities.samples, stencilBuffer: stencil, From fd55046326cf34ba5f0bcb900b5b0f91e5f84fbe Mon Sep 17 00:00:00 2001 From: "Mr.doob" Date: Mon, 8 Dec 2025 02:30:04 +0900 Subject: [PATCH 04/18] Clean up. --- src/renderers/webgl/WebGLOutputBuffer.js | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/renderers/webgl/WebGLOutputBuffer.js b/src/renderers/webgl/WebGLOutputBuffer.js index 7387c3e3e768f0..eabdb437c0efad 100644 --- a/src/renderers/webgl/WebGLOutputBuffer.js +++ b/src/renderers/webgl/WebGLOutputBuffer.js @@ -18,6 +18,16 @@ import { OrthographicCamera } from '../../cameras/OrthographicCamera.js'; import { WebGLRenderTarget } from '../WebGLRenderTarget.js'; import { ColorManagement } from '../../math/ColorManagement.js'; +const toneMappingMap = { + [ LinearToneMapping ]: 'LINEAR_TONE_MAPPING', + [ ReinhardToneMapping ]: 'REINHARD_TONE_MAPPING', + [ CineonToneMapping ]: 'CINEON_TONE_MAPPING', + [ ACESFilmicToneMapping ]: 'ACES_FILMIC_TONE_MAPPING', + [ AgXToneMapping ]: 'AGX_TONE_MAPPING', + [ NeutralToneMapping ]: 'NEUTRAL_TONE_MAPPING', + [ CustomToneMapping ]: 'CUSTOM_TONE_MAPPING' +}; + function WebGLOutputBuffer( type, width, height, depth, stencil ) { // render targets for scene and post-processing @@ -203,13 +213,8 @@ function WebGLOutputBuffer( type, width, height, depth, stencil ) { if ( ColorManagement.getTransfer( _outputColorSpace ) === SRGBTransfer ) outputMaterial.defines.SRGB_TRANSFER = ''; - if ( _outputToneMapping === LinearToneMapping ) outputMaterial.defines.LINEAR_TONE_MAPPING = ''; - else if ( _outputToneMapping === ReinhardToneMapping ) outputMaterial.defines.REINHARD_TONE_MAPPING = ''; - else if ( _outputToneMapping === CineonToneMapping ) outputMaterial.defines.CINEON_TONE_MAPPING = ''; - else if ( _outputToneMapping === ACESFilmicToneMapping ) outputMaterial.defines.ACES_FILMIC_TONE_MAPPING = ''; - else if ( _outputToneMapping === AgXToneMapping ) outputMaterial.defines.AGX_TONE_MAPPING = ''; - else if ( _outputToneMapping === NeutralToneMapping ) outputMaterial.defines.NEUTRAL_TONE_MAPPING = ''; - else if ( _outputToneMapping === CustomToneMapping ) outputMaterial.defines.CUSTOM_TONE_MAPPING = ''; + const toneMapping = toneMappingMap[ _outputToneMapping ]; + if ( toneMapping ) outputMaterial.defines[ toneMapping ] = ''; outputMaterial.needsUpdate = true; From d93357c58cd1af397a1f412711f0da16be7d765c Mon Sep 17 00:00:00 2001 From: "Mr.doob" Date: Mon, 8 Dec 2025 14:46:08 +0900 Subject: [PATCH 05/18] Renamed colorBufferType to outputBufferType. --- examples/webgl_loader_ldraw.html | 2 +- examples/webgl_watch.html | 2 +- src/renderers/WebGLRenderer.js | 11 ++++++----- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/examples/webgl_loader_ldraw.html b/examples/webgl_loader_ldraw.html index 63b1713aa72d29..8a2e0d6f60b4db 100644 --- a/examples/webgl_loader_ldraw.html +++ b/examples/webgl_loader_ldraw.html @@ -81,7 +81,7 @@ // - renderer = new THREE.WebGLRenderer( { antialias: true, colorBufferType: THREE.HalfFloatType } ); + renderer = new THREE.WebGLRenderer( { antialias: true, outputBufferType: THREE.HalfFloatType } ); renderer.setPixelRatio( window.devicePixelRatio ); renderer.setSize( window.innerWidth, window.innerHeight ); renderer.setAnimationLoop( animate ); diff --git a/examples/webgl_watch.html b/examples/webgl_watch.html index 490726bd406bd2..f83080b59d230e 100644 --- a/examples/webgl_watch.html +++ b/examples/webgl_watch.html @@ -67,7 +67,7 @@ scene = new THREE.Scene(); - renderer = new THREE.WebGLRenderer( { antialias: true, colorBufferType: THREE.HalfFloatType } ); + renderer = new THREE.WebGLRenderer( { antialias: true, outputBufferType: THREE.HalfFloatType } ); renderer.setPixelRatio( window.devicePixelRatio ); renderer.setSize( window.innerWidth, window.innerHeight ); renderer.setAnimationLoop( animate ); diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js index b5ae8956ba5000..96a4d3ffaa2c94 100644 --- a/src/renderers/WebGLRenderer.js +++ b/src/renderers/WebGLRenderer.js @@ -83,7 +83,7 @@ class WebGLRenderer { powerPreference = 'default', failIfMajorPerformanceCaveat = false, reversedDepthBuffer = false, - colorBufferType = UnsignedByteType, + outputBufferType = UnsignedByteType, } = parameters; /** @@ -113,7 +113,7 @@ class WebGLRenderer { } - const _colorBufferType = colorBufferType; + const _outputBufferType = outputBufferType; const INTEGER_FORMATS = new Set( [ RGBAIntegerFormat, @@ -543,9 +543,9 @@ class WebGLRenderer { // initialize internal render target for non-UnsignedByteType color buffer - if ( _colorBufferType !== UnsignedByteType ) { + if ( _outputBufferType !== UnsignedByteType ) { - outputBuffer = new WebGLOutputBuffer( _colorBufferType, canvas.width, canvas.height, depth, stencil ); + outputBuffer = new WebGLOutputBuffer( _outputBufferType, canvas.width, canvas.height, depth, stencil ); } @@ -729,7 +729,7 @@ class WebGLRenderer { if ( outputBuffer === null ) { - outputBuffer = new WebGLOutputBuffer( _colorBufferType, canvas.width, canvas.height, depth, stencil ); + outputBuffer = new WebGLOutputBuffer( _outputBufferType, canvas.width, canvas.height, depth, stencil ); } @@ -3528,6 +3528,7 @@ class WebGLRenderer { * Note that this setting uses `gl_FragDepth` if available which disables the Early Fragment Test optimization and can cause a decrease in performance. * @property {boolean} [reversedDepthBuffer=false] Whether to use a reverse depth buffer. Requires the `EXT_clip_control` extension. * This is a more faster and accurate version than logarithmic depth buffer. + * @property {number} [outputBufferType=UnsignedByteType] Defines the type of the output buffer. Use `HalfFloatType` for HDR rendering with tone mapping and post-processing support. **/ /** From 3b6e52b26579ea2dc32a451fcbcc5934b5c97a0c Mon Sep 17 00:00:00 2001 From: "Mr.doob" Date: Mon, 8 Dec 2025 16:04:01 +0900 Subject: [PATCH 06/18] Added effects support to WebXR. --- examples/webxr_xr_controls_transform.html | 12 ++++++++- src/renderers/WebGLRenderer.js | 28 +++++++++++++++----- src/renderers/webgl/WebGLOutputBuffer.js | 31 +++++++++++++++++++++-- 3 files changed, 62 insertions(+), 9 deletions(-) diff --git a/examples/webxr_xr_controls_transform.html b/examples/webxr_xr_controls_transform.html index 7e535b08fa0346..ce9e8ed4081011 100644 --- a/examples/webxr_xr_controls_transform.html +++ b/examples/webxr_xr_controls_transform.html @@ -27,9 +27,11 @@ import { TransformControls } from 'three/addons/controls/TransformControls.js'; import { XRButton } from 'three/addons/webxr/XRButton.js'; import { XRControllerModelFactory } from 'three/addons/webxr/XRControllerModelFactory.js'; + import { UnrealBloomPass } from 'three/addons/postprocessing/UnrealBloomPass.js'; let container; let camera, scene, renderer; + let bloomPass; let controller1, controller2, line; let controllerGrip1, controllerGrip2; @@ -110,14 +112,20 @@ // - renderer = new THREE.WebGLRenderer( { antialias: true } ); + renderer = new THREE.WebGLRenderer( { antialias: true, outputBufferType: THREE.HalfFloatType } ); renderer.setPixelRatio( window.devicePixelRatio ); renderer.setSize( window.innerWidth, window.innerHeight ); renderer.setAnimationLoop( animate ); renderer.shadowMap.enabled = true; + renderer.toneMapping = THREE.ACESFilmicToneMapping; renderer.xr.enabled = true; container.appendChild( renderer.domElement ); + // post-processing + + bloomPass = new UnrealBloomPass( new THREE.Vector2( window.innerWidth, window.innerHeight ), 1.5, 0.4, 0.85 ); + renderer.setEffects( [ bloomPass ] ); + document.body.appendChild( XRButton.createButton( renderer ) ); // controllers @@ -237,6 +245,8 @@ renderer.setSize( window.innerWidth, window.innerHeight ); + bloomPass.setSize( window.innerWidth, window.innerHeight ); + } // diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js index 96a4d3ffaa2c94..fd3abee4f93325 100644 --- a/src/renderers/WebGLRenderer.js +++ b/src/renderers/WebGLRenderer.js @@ -1588,7 +1588,11 @@ class WebGLRenderer { // use internal render target for HalfFloatType color buffer (only when tone mapping is enabled) - const useOutputBuffer = outputBuffer !== null && _currentRenderTarget === null && outputBuffer.isCopying() === false && outputBuffer.activate( _this ); + const isXRPresenting = xr.enabled === true && xr.isPresenting === true; + + if ( outputBuffer !== null ) outputBuffer.setRenderTarget( _currentRenderTarget, isXRPresenting ); + + const useOutputBuffer = outputBuffer !== null && ( _currentRenderTarget === null || isXRPresenting ) && outputBuffer.isCopying() === false && outputBuffer.activate( _this ); // update scene graph @@ -1598,7 +1602,7 @@ class WebGLRenderer { if ( camera.parent === null && camera.matrixWorldAutoUpdate === true ) camera.updateMatrixWorld(); - if ( xr.enabled === true && xr.isPresenting === true ) { + if ( xr.enabled === true && xr.isPresenting === true && ( outputBuffer === null || outputBuffer.isCopying() === false ) ) { if ( xr.cameraAutoUpdate === true ) xr.updateCamera( camera ); @@ -2781,7 +2785,7 @@ class WebGLRenderer { _currentActiveCubeFace = activeCubeFace; _currentActiveMipmapLevel = activeMipmapLevel; - let useDefaultFramebuffer = true; + const useDefaultFramebuffer = true; let framebuffer = null; let isCube = false; let isRenderTarget3D = false; @@ -2792,9 +2796,21 @@ class WebGLRenderer { if ( renderTargetProperties.__useDefaultFramebuffer !== undefined ) { - // We need to make sure to rebind the framebuffer. - state.bindFramebuffer( _gl.FRAMEBUFFER, null ); - useDefaultFramebuffer = false; + // Externally-managed framebuffer (e.g. XR) + // Bind to the stored framebuffer (may be null for default, or a WebGLFramebuffer) + state.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer ); + + _currentViewport.copy( renderTarget.viewport ); + _currentScissor.copy( renderTarget.scissor ); + _currentScissorTest = renderTarget.scissorTest; + + state.viewport( _currentViewport ); + state.scissor( _currentScissor ); + state.setScissorTest( _currentScissorTest ); + + _currentMaterialId = - 1; + + return; } else if ( renderTargetProperties.__webglFramebuffer === undefined ) { diff --git a/src/renderers/webgl/WebGLOutputBuffer.js b/src/renderers/webgl/WebGLOutputBuffer.js index eabdb437c0efad..ec379b46c8ab02 100644 --- a/src/renderers/webgl/WebGLOutputBuffer.js +++ b/src/renderers/webgl/WebGLOutputBuffer.js @@ -112,6 +112,7 @@ function WebGLOutputBuffer( type, width, height, depth, stencil ) { let _outputToneMapping = null; let _copyingToCanvas = false; let _savedToneMapping; + let _savedRenderTarget = null; let _passes = []; let _hasRenderPass = false; @@ -148,6 +149,31 @@ function WebGLOutputBuffer( type, width, height, depth, stencil ) { }; + this.setRenderTarget = function ( renderTarget, isXRPresenting ) { + + // Don't update saved render target during copying phase + // (post-processing passes call render() which would overwrite this) + if ( _copyingToCanvas ) return; + + _savedRenderTarget = renderTarget; + + // resize internal buffers to match render target (e.g. XR resolution) + // Only resize when entering XR, not on every frame + if ( isXRPresenting && renderTarget !== null ) { + + const width = renderTarget.width; + const height = renderTarget.height; + + if ( renderTargetA.width !== width || renderTargetA.height !== height ) { + + this.setSize( width, height ); + + } + + } + + }; + this.activate = function ( renderer ) { if ( this.enabled === false ) return false; @@ -220,11 +246,12 @@ function WebGLOutputBuffer( type, width, height, depth, stencil ) { } - // final output to canvas + // final output to canvas (or XR render target) outputMaterial.uniforms.tDiffuse.value = readBuffer.texture; - renderer.setRenderTarget( null ); + renderer.setRenderTarget( _savedRenderTarget ); renderer.render( outputMesh, outputCamera ); + _savedRenderTarget = null; _copyingToCanvas = false; }; From db61c5d70801ce32c4aef0d0338033da7720e780 Mon Sep 17 00:00:00 2001 From: "Mr.doob" Date: Mon, 8 Dec 2025 16:17:14 +0900 Subject: [PATCH 07/18] Updated screenshot. --- .../webxr_xr_controls_transform.jpg | Bin 38117 -> 44164 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/examples/screenshots/webxr_xr_controls_transform.jpg b/examples/screenshots/webxr_xr_controls_transform.jpg index 1eb4306a715ef0386a79a085324b1e006f276966..1931b1b51cea28584ad406d65603f4051a8b4c40 100644 GIT binary patch literal 44164 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

=fSXI#6W{Dfz>EpBAiZ>(VSfpNp1L)EU-Ce#uTg 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 AcmMzZ From bb80c77c6145fe8aff4f97c156c9c2d0896cbfe8 Mon Sep 17 00:00:00 2001 From: "Mr.doob" Date: Mon, 8 Dec 2025 16:17:47 +0900 Subject: [PATCH 08/18] We no longer need to resize the passes manually. --- examples/webgl_watch.html | 7 ------- examples/webxr_xr_controls_transform.html | 2 -- 2 files changed, 9 deletions(-) diff --git a/examples/webgl_watch.html b/examples/webgl_watch.html index f83080b59d230e..1d81c3ad3685f2 100644 --- a/examples/webgl_watch.html +++ b/examples/webgl_watch.html @@ -300,13 +300,6 @@ camera.updateProjectionMatrix(); renderer.setSize( width, height ); - if ( taaPass ) { - - taaPass.setSize( width, height ); - bloomPass.setSize( width, height ); - - } - } // diff --git a/examples/webxr_xr_controls_transform.html b/examples/webxr_xr_controls_transform.html index ce9e8ed4081011..3dc27cec8c4973 100644 --- a/examples/webxr_xr_controls_transform.html +++ b/examples/webxr_xr_controls_transform.html @@ -245,8 +245,6 @@ renderer.setSize( window.innerWidth, window.innerHeight ); - bloomPass.setSize( window.innerWidth, window.innerHeight ); - } // From 6c352979f38410d654efd9c2777bc1fa6bd91b82 Mon Sep 17 00:00:00 2001 From: "Mr.doob" Date: Tue, 9 Dec 2025 16:43:25 +0900 Subject: [PATCH 09/18] Fixed feedback loop in webgl_watch. --- src/renderers/WebGLRenderer.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js index fd3abee4f93325..ad299155305ee0 100644 --- a/src/renderers/WebGLRenderer.js +++ b/src/renderers/WebGLRenderer.js @@ -1590,9 +1590,11 @@ class WebGLRenderer { const isXRPresenting = xr.enabled === true && xr.isPresenting === true; - if ( outputBuffer !== null ) outputBuffer.setRenderTarget( _currentRenderTarget, isXRPresenting ); + let useOutputBuffer = outputBuffer !== null && ( _currentRenderTarget === null || isXRPresenting ) && outputBuffer.isCopying() === false; - const useOutputBuffer = outputBuffer !== null && ( _currentRenderTarget === null || isXRPresenting ) && outputBuffer.isCopying() === false && outputBuffer.activate( _this ); + if ( useOutputBuffer ) outputBuffer.setRenderTarget( _currentRenderTarget, isXRPresenting ); + + if ( useOutputBuffer && outputBuffer.activate( _this ) === false ) useOutputBuffer = false; // update scene graph From a2e424071ee2631d78d61ed6be0bdb4522cc3960 Mon Sep 17 00:00:00 2001 From: "Mr.doob" Date: Tue, 9 Dec 2025 22:48:09 +0900 Subject: [PATCH 10/18] Clean up. --- src/renderers/WebGLRenderer.js | 3 +-- src/renderers/webgl/WebGLOutputBuffer.js | 3 --- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js index ad299155305ee0..ef13a84b7041a8 100644 --- a/src/renderers/WebGLRenderer.js +++ b/src/renderers/WebGLRenderer.js @@ -2787,7 +2787,6 @@ class WebGLRenderer { _currentActiveCubeFace = activeCubeFace; _currentActiveMipmapLevel = activeMipmapLevel; - const useDefaultFramebuffer = true; let framebuffer = null; let isCube = false; let isRenderTarget3D = false; @@ -2911,7 +2910,7 @@ class WebGLRenderer { const framebufferBound = state.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); - if ( framebufferBound && useDefaultFramebuffer ) { + if ( framebufferBound ) { state.drawBuffers( renderTarget, framebuffer ); diff --git a/src/renderers/webgl/WebGLOutputBuffer.js b/src/renderers/webgl/WebGLOutputBuffer.js index ec379b46c8ab02..919738551279a5 100644 --- a/src/renderers/webgl/WebGLOutputBuffer.js +++ b/src/renderers/webgl/WebGLOutputBuffer.js @@ -116,8 +116,6 @@ function WebGLOutputBuffer( type, width, height, depth, stencil ) { let _passes = []; let _hasRenderPass = false; - this.enabled = true; - this.setSize = function ( width, height ) { renderTargetA.setSize( width, height ); @@ -176,7 +174,6 @@ function WebGLOutputBuffer( type, width, height, depth, stencil ) { this.activate = function ( renderer ) { - if ( this.enabled === false ) return false; if ( renderer.toneMapping === NoToneMapping && _passes.length === 0 ) return false; // if first pass is a render pass, it will set its own render target From 734ae02db64d3ee5a04fce4244dc70fefd479975 Mon Sep 17 00:00:00 2001 From: "Mr.doob" Date: Tue, 9 Dec 2025 22:49:01 +0900 Subject: [PATCH 11/18] Adjusted bloom strength in webgl_watch. --- examples/webgl_watch.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/webgl_watch.html b/examples/webgl_watch.html index 1d81c3ad3685f2..f77fb4d49f474e 100644 --- a/examples/webgl_watch.html +++ b/examples/webgl_watch.html @@ -51,7 +51,7 @@ metalness: 1.0, opacity: 0.4, threshold: 0, - strength: 0.08, + strength: 0.007, radius: 0.0, postProcess: false }; @@ -248,7 +248,7 @@ gui.add( setting, 'postProcess' ).onChange( postProcess ); gui.add( setting, 'threshold', 0, 1, 0.01 ).onChange( upBloom ); - gui.add( setting, 'strength', 0, 3, 0.01 ).onChange( upBloom ); + gui.add( setting, 'strength', 0, 0.1, 0.001 ).onChange( upBloom ); gui.add( setting, 'radius', 0, 1, 0.01 ).onChange( upBloom ); } From 7823d6d09c2afcec65ffe27fdf6cc9dbb7bbfcac Mon Sep 17 00:00:00 2001 From: "Mr.doob" Date: Tue, 9 Dec 2025 23:09:35 +0900 Subject: [PATCH 12/18] WebGLRenderer: Warn user when using redundant OutputPass in setEffects() --- examples/jsm/postprocessing/OutputPass.js | 9 +++++++++ src/renderers/WebGLRenderer.js | 15 +++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/examples/jsm/postprocessing/OutputPass.js b/examples/jsm/postprocessing/OutputPass.js index 1148de644671f9..1366c6e1906e22 100644 --- a/examples/jsm/postprocessing/OutputPass.js +++ b/examples/jsm/postprocessing/OutputPass.js @@ -39,6 +39,15 @@ class OutputPass extends Pass { super(); + /** + * This flag indicates that this is an output pass. + * + * @type {boolean} + * @readonly + * @default true + */ + this.isOutputPass = true; + /** * The pass uniforms. * diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js index ef13a84b7041a8..d98f9a0b6d1a15 100644 --- a/src/renderers/WebGLRenderer.js +++ b/src/renderers/WebGLRenderer.js @@ -733,6 +733,21 @@ class WebGLRenderer { } + if ( effects ) { + + for ( let i = 0; i < effects.length; i ++ ) { + + if ( effects[ i ].isOutputPass === true ) { + + console.warn( 'THREE.WebGLRenderer: OutputPass is not needed in setEffects(). Tone mapping and color space conversion are applied automatically.' ); + break; + + } + + } + + } + outputBuffer.setPasses( effects || [] ); }; From 3de32ff9e3140ef524d3cfd9640149d154b239c8 Mon Sep 17 00:00:00 2001 From: "Mr.doob" Date: Wed, 10 Dec 2025 00:06:20 +0900 Subject: [PATCH 13/18] Renamed WebGLOutputBuffer to WebGLOutput. --- src/renderers/WebGLRenderer.js | 28 +++++++++---------- .../{WebGLOutputBuffer.js => WebGLOutput.js} | 4 +-- 2 files changed, 16 insertions(+), 16 deletions(-) rename src/renderers/webgl/{WebGLOutputBuffer.js => WebGLOutput.js} (98%) diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js index d98f9a0b6d1a15..56a988ac61b514 100644 --- a/src/renderers/WebGLRenderer.js +++ b/src/renderers/WebGLRenderer.js @@ -39,7 +39,7 @@ import { WebGLIndexedBufferRenderer } from './webgl/WebGLIndexedBufferRenderer.j import { WebGLInfo } from './webgl/WebGLInfo.js'; import { WebGLMorphtargets } from './webgl/WebGLMorphtargets.js'; import { WebGLObjects } from './webgl/WebGLObjects.js'; -import { WebGLOutputBuffer } from './webgl/WebGLOutputBuffer.js'; +import { WebGLOutput } from './webgl/WebGLOutput.js'; import { WebGLPrograms } from './webgl/WebGLPrograms.js'; import { WebGLProperties } from './webgl/WebGLProperties.js'; import { WebGLRenderLists } from './webgl/WebGLRenderLists.js'; @@ -144,7 +144,7 @@ class WebGLRenderer { // internal render target for non-UnsignedByteType color buffer - let outputBuffer = null; + let output = null; // public properties @@ -545,7 +545,7 @@ class WebGLRenderer { if ( _outputBufferType !== UnsignedByteType ) { - outputBuffer = new WebGLOutputBuffer( _outputBufferType, canvas.width, canvas.height, depth, stencil ); + output = new WebGLOutput( _outputBufferType, canvas.width, canvas.height, depth, stencil ); } @@ -671,9 +671,9 @@ class WebGLRenderer { } - if ( outputBuffer !== null ) { + if ( output !== null ) { - outputBuffer.setSize( canvas.width, canvas.height ); + output.setSize( canvas.width, canvas.height ); } @@ -727,9 +727,9 @@ class WebGLRenderer { */ this.setEffects = function ( effects ) { - if ( outputBuffer === null ) { + if ( output === null ) { - outputBuffer = new WebGLOutputBuffer( _outputBufferType, canvas.width, canvas.height, depth, stencil ); + output = new WebGLOutput( _outputBufferType, canvas.width, canvas.height, depth, stencil ); } @@ -748,7 +748,7 @@ class WebGLRenderer { } - outputBuffer.setPasses( effects || [] ); + output.setPasses( effects || [] ); }; @@ -1605,11 +1605,11 @@ class WebGLRenderer { const isXRPresenting = xr.enabled === true && xr.isPresenting === true; - let useOutputBuffer = outputBuffer !== null && ( _currentRenderTarget === null || isXRPresenting ) && outputBuffer.isCopying() === false; + let useOutputBuffer = output !== null && ( _currentRenderTarget === null || isXRPresenting ) && output.isCopying() === false; - if ( useOutputBuffer ) outputBuffer.setRenderTarget( _currentRenderTarget, isXRPresenting ); + if ( useOutputBuffer ) output.setRenderTarget( _currentRenderTarget, isXRPresenting ); - if ( useOutputBuffer && outputBuffer.activate( _this ) === false ) useOutputBuffer = false; + if ( useOutputBuffer && output.activate( _this ) === false ) useOutputBuffer = false; // update scene graph @@ -1619,7 +1619,7 @@ class WebGLRenderer { if ( camera.parent === null && camera.matrixWorldAutoUpdate === true ) camera.updateMatrixWorld(); - if ( xr.enabled === true && xr.isPresenting === true && ( outputBuffer === null || outputBuffer.isCopying() === false ) ) { + if ( xr.enabled === true && xr.isPresenting === true && ( output === null || output.isCopying() === false ) ) { if ( xr.cameraAutoUpdate === true ) xr.updateCamera( camera ); @@ -1693,7 +1693,7 @@ class WebGLRenderer { // render scene (skip if first effect is a render pass - it will render the scene itself) - const skipSceneRender = useOutputBuffer && outputBuffer.hasRenderPass(); + const skipSceneRender = useOutputBuffer && output.hasRenderPass(); if ( skipSceneRender === false ) { @@ -1758,7 +1758,7 @@ class WebGLRenderer { if ( useOutputBuffer ) { - outputBuffer.render( _this ); + output.render( _this ); } diff --git a/src/renderers/webgl/WebGLOutputBuffer.js b/src/renderers/webgl/WebGLOutput.js similarity index 98% rename from src/renderers/webgl/WebGLOutputBuffer.js rename to src/renderers/webgl/WebGLOutput.js index 919738551279a5..4a71785b0f66fb 100644 --- a/src/renderers/webgl/WebGLOutputBuffer.js +++ b/src/renderers/webgl/WebGLOutput.js @@ -28,7 +28,7 @@ const toneMappingMap = { [ CustomToneMapping ]: 'CUSTOM_TONE_MAPPING' }; -function WebGLOutputBuffer( type, width, height, depth, stencil ) { +function WebGLOutput( type, width, height, depth, stencil ) { // render targets for scene and post-processing const renderTargetA = new WebGLRenderTarget( width, height, { @@ -270,4 +270,4 @@ function WebGLOutputBuffer( type, width, height, depth, stencil ) { } -export { WebGLOutputBuffer }; +export { WebGLOutput }; From 1fd04d1e60113d9fe5c6c1a7f6127004b81481b8 Mon Sep 17 00:00:00 2001 From: "Mr.doob" Date: Wed, 10 Dec 2025 00:19:53 +0900 Subject: [PATCH 14/18] Simplified WebGLOutput. --- src/renderers/WebGLRenderer.js | 12 ++++-------- src/renderers/webgl/WebGLOutput.js | 20 +++++++------------- 2 files changed, 11 insertions(+), 21 deletions(-) diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js index 56a988ac61b514..60e43b4bdf9e46 100644 --- a/src/renderers/WebGLRenderer.js +++ b/src/renderers/WebGLRenderer.js @@ -1605,11 +1605,7 @@ class WebGLRenderer { const isXRPresenting = xr.enabled === true && xr.isPresenting === true; - let useOutputBuffer = output !== null && ( _currentRenderTarget === null || isXRPresenting ) && output.isCopying() === false; - - if ( useOutputBuffer ) output.setRenderTarget( _currentRenderTarget, isXRPresenting ); - - if ( useOutputBuffer && output.activate( _this ) === false ) useOutputBuffer = false; + const useOutput = output !== null && ( _currentRenderTarget === null || isXRPresenting ) && output.begin( _this, _currentRenderTarget ); // update scene graph @@ -1693,7 +1689,7 @@ class WebGLRenderer { // render scene (skip if first effect is a render pass - it will render the scene itself) - const skipSceneRender = useOutputBuffer && output.hasRenderPass(); + const skipSceneRender = useOutput && output.hasRenderPass(); if ( skipSceneRender === false ) { @@ -1756,9 +1752,9 @@ class WebGLRenderer { // copy from internal render target to canvas using fullscreen quad - if ( useOutputBuffer ) { + if ( useOutput ) { - output.render( _this ); + output.end( _this ); } diff --git a/src/renderers/webgl/WebGLOutput.js b/src/renderers/webgl/WebGLOutput.js index 4a71785b0f66fb..7a2959ee152232 100644 --- a/src/renderers/webgl/WebGLOutput.js +++ b/src/renderers/webgl/WebGLOutput.js @@ -147,17 +147,17 @@ function WebGLOutput( type, width, height, depth, stencil ) { }; - this.setRenderTarget = function ( renderTarget, isXRPresenting ) { + this.begin = function ( renderer, renderTarget ) { - // Don't update saved render target during copying phase - // (post-processing passes call render() which would overwrite this) - if ( _copyingToCanvas ) return; + // Don't activate during copying phase (post-processing passes call render()) + if ( _copyingToCanvas ) return false; + + if ( renderer.toneMapping === NoToneMapping && _passes.length === 0 ) return false; _savedRenderTarget = renderTarget; // resize internal buffers to match render target (e.g. XR resolution) - // Only resize when entering XR, not on every frame - if ( isXRPresenting && renderTarget !== null ) { + if ( renderTarget !== null ) { const width = renderTarget.width; const height = renderTarget.height; @@ -170,12 +170,6 @@ function WebGLOutput( type, width, height, depth, stencil ) { } - }; - - this.activate = function ( renderer ) { - - if ( renderer.toneMapping === NoToneMapping && _passes.length === 0 ) return false; - // if first pass is a render pass, it will set its own render target if ( _hasRenderPass === false ) { @@ -197,7 +191,7 @@ function WebGLOutput( type, width, height, depth, stencil ) { }; - this.render = function ( renderer, deltaTime ) { + this.end = function ( renderer, deltaTime ) { // restore tone mapping renderer.toneMapping = _savedToneMapping; From 16b92b1fa5ce90e7c5a36661075e5dbf56d69219 Mon Sep 17 00:00:00 2001 From: "Mr.doob" Date: Wed, 10 Dec 2025 01:03:00 +0900 Subject: [PATCH 15/18] Clean up. --- src/renderers/webgl/WebGLOutput.js | 44 +++++++++++++++--------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/src/renderers/webgl/WebGLOutput.js b/src/renderers/webgl/WebGLOutput.js index 7a2959ee152232..be242e26147adc 100644 --- a/src/renderers/webgl/WebGLOutput.js +++ b/src/renderers/webgl/WebGLOutput.js @@ -31,13 +31,13 @@ const toneMappingMap = { function WebGLOutput( type, width, height, depth, stencil ) { // render targets for scene and post-processing - const renderTargetA = new WebGLRenderTarget( width, height, { + const targetA = new WebGLRenderTarget( width, height, { type: type, depthBuffer: depth, stencilBuffer: stencil } ); - const renderTargetB = new WebGLRenderTarget( width, height, { + const targetB = new WebGLRenderTarget( width, height, { type: HalfFloatType, depthBuffer: false, stencilBuffer: false @@ -49,7 +49,7 @@ function WebGLOutput( type, width, height, depth, stencil ) { geometry.setAttribute( 'uv', new Float32BufferAttribute( [ 0, 2, 0, 0, 2, 0 ], 2 ) ); // create output material with tone mapping support - const outputMaterial = new RawShaderMaterial( { + const material = new RawShaderMaterial( { uniforms: { tDiffuse: { value: null } }, @@ -105,8 +105,8 @@ function WebGLOutput( type, width, height, depth, stencil ) { depthWrite: false } ); - const outputMesh = new Mesh( geometry, outputMaterial ); - const outputCamera = new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 ); + const mesh = new Mesh( geometry, material ); + const camera = new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 ); let _outputColorSpace = null; let _outputToneMapping = null; @@ -118,8 +118,8 @@ function WebGLOutput( type, width, height, depth, stencil ) { this.setSize = function ( width, height ) { - renderTargetA.setSize( width, height ); - renderTargetB.setSize( width, height ); + targetA.setSize( width, height ); + targetB.setSize( width, height ); for ( let i = 0; i < _passes.length; i ++ ) { @@ -135,8 +135,8 @@ function WebGLOutput( type, width, height, depth, stencil ) { _passes = passes; _hasRenderPass = _passes.length > 0 && _passes[ 0 ].isRenderPass === true; - const width = renderTargetA.width; - const height = renderTargetA.height; + const width = targetA.width; + const height = targetA.height; for ( let i = 0; i < _passes.length; i ++ ) { @@ -162,7 +162,7 @@ function WebGLOutput( type, width, height, depth, stencil ) { const width = renderTarget.width; const height = renderTarget.height; - if ( renderTargetA.width !== width || renderTargetA.height !== height ) { + if ( targetA.width !== width || targetA.height !== height ) { this.setSize( width, height ); @@ -173,7 +173,7 @@ function WebGLOutput( type, width, height, depth, stencil ) { // if first pass is a render pass, it will set its own render target if ( _hasRenderPass === false ) { - renderer.setRenderTarget( renderTargetA ); + renderer.setRenderTarget( targetA ); } @@ -199,8 +199,8 @@ function WebGLOutput( type, width, height, depth, stencil ) { _copyingToCanvas = true; // run post-processing passes - let readBuffer = renderTargetA; - let writeBuffer = renderTargetB; + let readBuffer = targetA; + let writeBuffer = targetB; for ( let i = 0; i < _passes.length; i ++ ) { @@ -226,21 +226,21 @@ function WebGLOutput( type, width, height, depth, stencil ) { _outputColorSpace = renderer.outputColorSpace; _outputToneMapping = renderer.toneMapping; - outputMaterial.defines = {}; + material.defines = {}; - if ( ColorManagement.getTransfer( _outputColorSpace ) === SRGBTransfer ) outputMaterial.defines.SRGB_TRANSFER = ''; + if ( ColorManagement.getTransfer( _outputColorSpace ) === SRGBTransfer ) material.defines.SRGB_TRANSFER = ''; const toneMapping = toneMappingMap[ _outputToneMapping ]; - if ( toneMapping ) outputMaterial.defines[ toneMapping ] = ''; + if ( toneMapping ) material.defines[ toneMapping ] = ''; - outputMaterial.needsUpdate = true; + material.needsUpdate = true; } // final output to canvas (or XR render target) - outputMaterial.uniforms.tDiffuse.value = readBuffer.texture; + material.uniforms.tDiffuse.value = readBuffer.texture; renderer.setRenderTarget( _savedRenderTarget ); - renderer.render( outputMesh, outputCamera ); + renderer.render( mesh, camera ); _savedRenderTarget = null; _copyingToCanvas = false; @@ -255,10 +255,10 @@ function WebGLOutput( type, width, height, depth, stencil ) { this.dispose = function () { - renderTargetA.dispose(); - renderTargetB.dispose(); + targetA.dispose(); + targetB.dispose(); geometry.dispose(); - outputMaterial.dispose(); + material.dispose(); }; From 77a9932fb98fc1770983b03dfa90ade528b4f60a Mon Sep 17 00:00:00 2001 From: "Mr.doob" Date: Wed, 10 Dec 2025 01:04:28 +0900 Subject: [PATCH 16/18] Simplified watch example. --- examples/webgl_watch.html | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/examples/webgl_watch.html b/examples/webgl_watch.html index f77fb4d49f474e..b4ff698edb1336 100644 --- a/examples/webgl_watch.html +++ b/examples/webgl_watch.html @@ -77,6 +77,14 @@ renderer.shadowMap.type = THREE.VSMShadowMap; container.appendChild( renderer.domElement ); + taaPass = new TAARenderPass( scene, camera ); + taaPass.sampleLevel = 2; + + bloomPass = new UnrealBloomPass( new THREE.Vector2( window.innerWidth, window.innerHeight ), 1.5, 0.4, 0.85 ); + bloomPass.threshold = setting.threshold; + bloomPass.strength = setting.strength; + bloomPass.radius = setting.radius; + new HDRLoader() .setPath( 'textures/equirectangular/' ) .load( 'lobe.hdr', function ( texture ) { @@ -211,26 +219,10 @@ if ( b ) { - if ( bloomPass ) return; - - taaPass = new TAARenderPass( scene, camera ); - taaPass.sampleLevel = 2; - - bloomPass = new UnrealBloomPass( new THREE.Vector2( window.innerWidth, window.innerHeight ), 1.5, 0.4, 0.85 ); - bloomPass.threshold = setting.threshold; - bloomPass.strength = setting.strength; - bloomPass.radius = setting.radius; - renderer.setEffects( [ taaPass, bloomPass ] ); } else { - if ( ! bloomPass ) return; - taaPass.dispose(); - taaPass = null; - bloomPass.dispose(); - bloomPass = null; - renderer.setEffects( null ); } From 1e983cc4b48226fb2ac1bbcabb967d9c0aae0a66 Mon Sep 17 00:00:00 2001 From: "Mr.doob" Date: Wed, 10 Dec 2025 01:20:15 +0900 Subject: [PATCH 17/18] WebGLRenderer: Only allow effects when outputBufferType isn't UnsignedByteType. --- src/renderers/WebGLRenderer.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js index 60e43b4bdf9e46..b271bbd3833fe1 100644 --- a/src/renderers/WebGLRenderer.js +++ b/src/renderers/WebGLRenderer.js @@ -727,9 +727,10 @@ class WebGLRenderer { */ this.setEffects = function ( effects ) { - if ( output === null ) { + if ( _outputBufferType === UnsignedByteType ) { - output = new WebGLOutput( _outputBufferType, canvas.width, canvas.height, depth, stencil ); + console.error( 'THREE.WebGLRenderer: setEffects() requires outputBufferType set to HalfFloatType or FloatType.' ); + return; } From b430c9f04078262c94ff43180accb49651516dd7 Mon Sep 17 00:00:00 2001 From: "Mr.doob" Date: Wed, 10 Dec 2025 01:38:16 +0900 Subject: [PATCH 18/18] Clean up. --- src/renderers/WebGLRenderer.js | 4 +-- src/renderers/webgl/WebGLOutput.js | 52 +++++++++++++++--------------- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js index b271bbd3833fe1..4c523e3259e96f 100644 --- a/src/renderers/WebGLRenderer.js +++ b/src/renderers/WebGLRenderer.js @@ -749,7 +749,7 @@ class WebGLRenderer { } - output.setPasses( effects || [] ); + output.setEffects( effects || [] ); }; @@ -1616,7 +1616,7 @@ class WebGLRenderer { if ( camera.parent === null && camera.matrixWorldAutoUpdate === true ) camera.updateMatrixWorld(); - if ( xr.enabled === true && xr.isPresenting === true && ( output === null || output.isCopying() === false ) ) { + if ( xr.enabled === true && xr.isPresenting === true && ( output === null || output.isCompositing() === false ) ) { if ( xr.cameraAutoUpdate === true ) xr.updateCamera( camera ); diff --git a/src/renderers/webgl/WebGLOutput.js b/src/renderers/webgl/WebGLOutput.js index be242e26147adc..711411fb2a8f95 100644 --- a/src/renderers/webgl/WebGLOutput.js +++ b/src/renderers/webgl/WebGLOutput.js @@ -110,10 +110,10 @@ function WebGLOutput( type, width, height, depth, stencil ) { let _outputColorSpace = null; let _outputToneMapping = null; - let _copyingToCanvas = false; + let _isCompositing = false; let _savedToneMapping; let _savedRenderTarget = null; - let _passes = []; + let _effects = []; let _hasRenderPass = false; this.setSize = function ( width, height ) { @@ -121,27 +121,27 @@ function WebGLOutput( type, width, height, depth, stencil ) { targetA.setSize( width, height ); targetB.setSize( width, height ); - for ( let i = 0; i < _passes.length; i ++ ) { + for ( let i = 0; i < _effects.length; i ++ ) { - const pass = _passes[ i ]; - if ( pass.setSize ) pass.setSize( width, height ); + const effect = _effects[ i ]; + if ( effect.setSize ) effect.setSize( width, height ); } }; - this.setPasses = function ( passes ) { + this.setEffects = function ( effects ) { - _passes = passes; - _hasRenderPass = _passes.length > 0 && _passes[ 0 ].isRenderPass === true; + _effects = effects; + _hasRenderPass = _effects.length > 0 && _effects[ 0 ].isRenderPass === true; const width = targetA.width; const height = targetA.height; - for ( let i = 0; i < _passes.length; i ++ ) { + for ( let i = 0; i < _effects.length; i ++ ) { - const pass = _passes[ i ]; - if ( pass.setSize ) pass.setSize( width, height ); + const effect = _effects[ i ]; + if ( effect.setSize ) effect.setSize( width, height ); } @@ -149,10 +149,10 @@ function WebGLOutput( type, width, height, depth, stencil ) { this.begin = function ( renderer, renderTarget ) { - // Don't activate during copying phase (post-processing passes call render()) - if ( _copyingToCanvas ) return false; + // Don't begin during compositing phase (post-processing effects call render()) + if ( _isCompositing ) return false; - if ( renderer.toneMapping === NoToneMapping && _passes.length === 0 ) return false; + if ( renderer.toneMapping === NoToneMapping && _effects.length === 0 ) return false; _savedRenderTarget = renderTarget; @@ -170,14 +170,14 @@ function WebGLOutput( type, width, height, depth, stencil ) { } - // if first pass is a render pass, it will set its own render target + // if first effect is a RenderPass, it will set its own render target if ( _hasRenderPass === false ) { renderer.setRenderTarget( targetA ); } - // disable tone mapping during render - it will be applied when copying to canvas + // disable tone mapping during render - it will be applied in end() _savedToneMapping = renderer.toneMapping; renderer.toneMapping = NoToneMapping; @@ -196,21 +196,21 @@ function WebGLOutput( type, width, height, depth, stencil ) { // restore tone mapping renderer.toneMapping = _savedToneMapping; - _copyingToCanvas = true; + _isCompositing = true; - // run post-processing passes + // run post-processing effects let readBuffer = targetA; let writeBuffer = targetB; - for ( let i = 0; i < _passes.length; i ++ ) { + for ( let i = 0; i < _effects.length; i ++ ) { - const pass = _passes[ i ]; + const effect = _effects[ i ]; - if ( pass.enabled === false ) continue; + if ( effect.enabled === false ) continue; - pass.render( renderer, writeBuffer, readBuffer, deltaTime ); + effect.render( renderer, writeBuffer, readBuffer, deltaTime ); - if ( pass.needsSwap !== false ) { + if ( effect.needsSwap !== false ) { const temp = readBuffer; readBuffer = writeBuffer; @@ -243,13 +243,13 @@ function WebGLOutput( type, width, height, depth, stencil ) { renderer.render( mesh, camera ); _savedRenderTarget = null; - _copyingToCanvas = false; + _isCompositing = false; }; - this.isCopying = function () { + this.isCompositing = function () { - return _copyingToCanvas; + return _isCompositing; };