From cfc5198905c15a87ea63804915bcaa2b1a757ec4 Mon Sep 17 00:00:00 2001 From: sunag Date: Tue, 19 May 2026 04:00:48 -0300 Subject: [PATCH 1/3] Examples: Improve webgpu anamorphic, `rtt` and `bloom` (#33600) --- examples/jsm/tsl/display/AnamorphicNode.js | 293 ------------------ examples/jsm/tsl/display/BloomNode.js | 74 ++++- .../webgpu_postprocessing_anamorphic.jpg | Bin 30785 -> 26333 bytes .../webgpu_postprocessing_anamorphic.html | 129 +++++--- src/nodes/utils/RTTNode.js | 24 +- 5 files changed, 166 insertions(+), 354 deletions(-) delete mode 100644 examples/jsm/tsl/display/AnamorphicNode.js diff --git a/examples/jsm/tsl/display/AnamorphicNode.js b/examples/jsm/tsl/display/AnamorphicNode.js deleted file mode 100644 index 3033ca4baf1855..00000000000000 --- a/examples/jsm/tsl/display/AnamorphicNode.js +++ /dev/null @@ -1,293 +0,0 @@ -import { RenderTarget, Vector2, TempNode, QuadMesh, NodeMaterial, RendererUtils } from 'three/webgpu'; -import { nodeObject, Fn, float, NodeUpdateType, uv, passTexture, uniform, convertToTexture, vec2, vec3, Loop, mix, luminance } from 'three/tsl'; - -const _quadMesh = /*@__PURE__*/ new QuadMesh(); - -let _rendererState; - -/** - * Post processing node for adding an anamorphic flare effect. - * - * @augments TempNode - * @three_import import { anamorphic } from 'three/addons/tsl/display/AnamorphicNode.js'; - */ -class AnamorphicNode extends TempNode { - - static get type() { - - return 'AnamorphicNode'; - - } - - /** - * Constructs a new anamorphic node. - * - * @param {TextureNode} textureNode - The texture node that represents the input of the effect. - * @param {Node} thresholdNode - The threshold is one option to control the intensity and size of the effect. - * @param {Node} scaleNode - Defines the vertical scale of the flares. - * @param {number} samples - More samples result in larger flares and a more expensive runtime behavior. - */ - constructor( textureNode, thresholdNode, scaleNode, samples ) { - - super( 'vec4' ); - - /** - * The texture node that represents the input of the effect. - * - * @type {TextureNode} - */ - this.textureNode = textureNode; - - /** - * The threshold is one option to control the intensity and size of the effect. - * - * @type {Node} - */ - this.thresholdNode = thresholdNode; - - /** - * Defines the vertical scale of the flares. - * - * @type {Node} - */ - this.scaleNode = scaleNode; - - /** - * The color of the flares. - * - * @type {Node} - */ - this.colorNode = vec3( 0.1, 0.0, 1.0 ); - - /** - * More samples result in larger flares and a more expensive runtime behavior. - * - * @type {Node} - */ - this.samples = samples; - - /** - * The resolution scale. - * - * @type {number} - */ - this.resolutionScale = 1; - - /** - * The internal render target of the effect. - * - * @private - * @type {RenderTarget} - */ - this._renderTarget = new RenderTarget( 1, 1, { depthBuffer: false } ); - this._renderTarget.texture.name = 'anamorphic'; - - /** - * A uniform node holding the inverse resolution value. - * - * @private - * @type {UniformNode} - */ - this._invSize = uniform( new Vector2() ); - - /** - * The result of the effect is represented as a separate texture node. - * - * @private - * @type {PassTextureNode} - */ - this._textureNode = passTexture( this, this._renderTarget.texture ); - - /** - * The material for the anamorphic pass. - * - * @private - * @type {?NodeMaterial} - */ - this._material = null; - - - /** - * The `updateBeforeType` is set to `NodeUpdateType.FRAME` since the node renders - * its effect once per frame in `updateBefore()`. - * - * @type {string} - * @default 'frame' - */ - this.updateBeforeType = NodeUpdateType.FRAME; - - } - - /** - * Returns the result of the effect as a texture node. - * - * @return {PassTextureNode} A texture node that represents the result of the effect. - */ - getTextureNode() { - - return this._textureNode; - - } - - /** - * Sets the size of the effect. - * - * @param {number} width - The width of the effect. - * @param {number} height - The height of the effect. - */ - setSize( width, height ) { - - this._invSize.value.set( 1 / width, 1 / height ); - - width = Math.max( Math.round( width * this.resolutionScale ), 1 ); - height = Math.max( Math.round( height * this.resolutionScale ), 1 ); - - this._renderTarget.setSize( width, height ); - - } - - /** - * This method is used to render the effect once per frame. - * - * @param {NodeFrame} frame - The current node frame. - */ - updateBefore( frame ) { - - const { renderer } = frame; - - _rendererState = RendererUtils.resetRendererState( renderer, _rendererState ); - - // - - const textureNode = this.textureNode; - const map = textureNode.value; - - this._renderTarget.texture.type = map.type; - - const currentTexture = textureNode.value; - - _quadMesh.material = this._material; - _quadMesh.name = 'Anamorphic'; - - this.setSize( map.image.width, map.image.height ); - - // render - - renderer.setRenderTarget( this._renderTarget ); - - _quadMesh.render( renderer ); - - // restore - - textureNode.value = currentTexture; - - RendererUtils.restoreRendererState( renderer, _rendererState ); - - } - - /** - * This method is used to setup the effect's TSL code. - * - * @param {NodeBuilder} builder - The current node builder. - * @return {PassTextureNode} - */ - setup( builder ) { - - const textureNode = this.textureNode; - const uvNode = textureNode.uvNode || uv(); - - const sampleTexture = ( uv ) => textureNode.sample( uv ); - - const threshold = ( color, threshold ) => mix( vec3( 0.0 ), color, luminance( color ).sub( threshold ).max( 0 ) ); - - const anamorph = Fn( () => { - - const samples = this.samples; - const halfSamples = Math.floor( samples / 2 ); - - const total = vec3( 0 ).toVar(); - - Loop( { start: - halfSamples, end: halfSamples }, ( { i } ) => { - - const softness = float( i ).abs().div( halfSamples ).oneMinus(); - - const uv = vec2( uvNode.x.add( this._invSize.x.mul( i ).mul( this.scaleNode ) ), uvNode.y ); - const color = sampleTexture( uv ); - const pass = threshold( color, this.thresholdNode ).mul( softness ); - - total.addAssign( pass ); - - } ); - - return total.mul( this.colorNode ); - - } ); - - // - - const material = this._material || ( this._material = new NodeMaterial() ); - material.name = 'Anamorphic'; - material.fragmentNode = anamorph(); - - // - - const properties = builder.getNodeProperties( this ); - properties.textureNode = textureNode; - - // - - return this._textureNode; - - } - - /** - * Frees internal resources. This method should be called - * when the effect is no longer required. - */ - dispose() { - - this._renderTarget.dispose(); - - if ( this._material !== null ) this._material.dispose(); - - } - - /** - * The resolution scale. - * - * @deprecated - * @type {Vector2} - * @default {(1,1)} - */ - get resolution() { - - console.warn( 'THREE.AnamorphicNode: The "resolution" property has been renamed to "resolutionScale" and is now of type `number`.' ); // @deprecated r180 - - return new Vector2( this.resolutionScale, this.resolutionScale ); - - } - - set resolution( value ) { - - console.warn( 'THREE.AnamorphicNode: The "resolution" property has been renamed to "resolutionScale" and is now of type `number`.' ); // @deprecated r180 - - this.resolutionScale = value.x; - - } - -} - -/** - * TSL function for creating an anamorphic flare effect. - * - * @tsl - * @function - * @param {TextureNode} node - The node that represents the input of the effect. - * @param {Node | number} [threshold=0.9] - The threshold is one option to control the intensity and size of the effect. - * @param {Node | number} [scale=3] - Defines the vertical scale of the flares. - * @param {number} [samples=32] - More samples result in larger flares and a more expensive runtime behavior. - * @returns {AnamorphicNode} - */ -export const anamorphic = ( node, threshold = .9, scale = 3, samples = 32 ) => new AnamorphicNode( convertToTexture( node ), nodeObject( threshold ), nodeObject( scale ), samples ); - -export default AnamorphicNode; diff --git a/examples/jsm/tsl/display/BloomNode.js b/examples/jsm/tsl/display/BloomNode.js index eeb12261d94cc5..947ac837c802d9 100644 --- a/examples/jsm/tsl/display/BloomNode.js +++ b/examples/jsm/tsl/display/BloomNode.js @@ -9,6 +9,15 @@ const _BlurDirectionY = /*@__PURE__*/ new Vector2( 0.0, 1.0 ); let _rendererState; +const luminosityHighPass = Fn( ( { input, threshold, smoothWidth } ) => { + + const v = luminance( input.rgb ); + const alpha = smoothstep( threshold, threshold.add( smoothWidth ), v ); + + return mix( vec4( 0 ), input, alpha ); + +} ); + /** * Post processing node for creating a bloom effect. * ```js @@ -74,21 +83,21 @@ class BloomNode extends TempNode { * * @type {UniformNode} */ - this.strength = uniform( strength ); + this.strength = strength.isNode ? strength : uniform( strength ); /** * The radius of the bloom. Must be in the range `[0,1]`. * * @type {UniformNode} */ - this.radius = uniform( radius ); + this.radius = radius.isNode ? radius : uniform( radius ); /** * The luminance threshold limits which bright areas contribute to the bloom effect. * * @type {UniformNode} */ - this.threshold = uniform( threshold ); + this.threshold = threshold.isNode ? threshold : uniform( threshold ); /** * Can be used to tweak the extracted luminance from the scene. @@ -97,6 +106,22 @@ class BloomNode extends TempNode { */ this.smoothWidth = uniform( 0.01 ); + /** + * Scale factor for the internal render targets. + * + * @private + * @type {number} + * @default 0.5 + */ + this._resolutionScale = 0.5; + + /** + * Can be used to inject a custom high pass filter (e.g., for anamorphic effects). + * + * @type {Function} + */ + this.highPassFn = luminosityHighPass; + /** * An array that holds the render targets for the horizontal blur passes. * @@ -253,6 +278,32 @@ class BloomNode extends TempNode { } + /** + * Sets the resolution scale for the pass. + * The resolution scale is a factor that is multiplied with the renderer's width and height. + * + * @param {number} resolutionScale - The resolution scale to set. A value of `1` means full resolution. + * @return {BloomNode} A reference to this node. + */ + setResolutionScale( resolutionScale ) { + + this._resolutionScale = resolutionScale; + + return this; + + } + + /** + * Gets the current resolution scale of the pass. + * + * @return {number} The current resolution scale. A value of `1` means full resolution. + */ + getResolutionScale() { + + return this._resolutionScale; + + } + /** * Sets the size of the effect. * @@ -261,8 +312,8 @@ class BloomNode extends TempNode { */ setSize( width, height ) { - let resx = Math.round( width / 2 ); - let resy = Math.round( height / 2 ); + let resx = Math.round( width * this._resolutionScale ); + let resy = Math.round( height * this._resolutionScale ); this._renderTargetBright.setSize( resx, resy ); @@ -350,19 +401,8 @@ class BloomNode extends TempNode { // luminosity high pass material - const luminosityHighPass = Fn( () => { - - const texel = this.inputNode; - const v = luminance( texel.rgb ); - - const alpha = smoothstep( this.threshold, this.threshold.add( this.smoothWidth ), v ); - - return mix( vec4( 0 ), texel, alpha ); - - } ); - this._highPassFilterMaterial = this._highPassFilterMaterial || new NodeMaterial(); - this._highPassFilterMaterial.fragmentNode = luminosityHighPass().context( builder.getSharedContext() ); + this._highPassFilterMaterial.fragmentNode = this.highPassFn( { input: this.inputNode, threshold: this.threshold, smoothWidth: this.smoothWidth } ).context( builder.getSharedContext() ); this._highPassFilterMaterial.name = 'Bloom_highPass'; this._highPassFilterMaterial.needsUpdate = true; diff --git a/examples/screenshots/webgpu_postprocessing_anamorphic.jpg b/examples/screenshots/webgpu_postprocessing_anamorphic.jpg index 8f41910256faf797dda846d7158d6161f8da2252..e83b9cadc02f0a6dad2740af0baf1756e07f92d7 100644 GIT binary patch delta 25937 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 g=aQ5!i_@% delta 30424 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 F{||zlDER;Y diff --git a/examples/webgpu_postprocessing_anamorphic.html b/examples/webgpu_postprocessing_anamorphic.html index 7895a769cf3f62..ee765cda40b932 100644 --- a/examples/webgpu_postprocessing_anamorphic.html +++ b/examples/webgpu_postprocessing_anamorphic.html @@ -20,7 +20,7 @@ - Battle Damaged Sci-fi Helmet by theblueturtle_. + Anamorphic bloom filter using custom high pass filter. @@ -38,22 +38,17 @@