From 8140aed2c3f6b0d1e92e9d65818f13111152f071 Mon Sep 17 00:00:00 2001 From: sunag Date: Mon, 13 Jul 2026 18:14:22 -0300 Subject: [PATCH] SMAANode: Fix and simplification (#34031) --- examples/jsm/tsl/display/SMAANode.js | 76 ++++-------------- .../webgpu_postprocessing_smaa.jpg | Bin 17228 -> 17237 bytes 2 files changed, 15 insertions(+), 61 deletions(-) diff --git a/examples/jsm/tsl/display/SMAANode.js b/examples/jsm/tsl/display/SMAANode.js index 7b550223936eed..a1e9e1e83a4cb7 100644 --- a/examples/jsm/tsl/display/SMAANode.js +++ b/examples/jsm/tsl/display/SMAANode.js @@ -1,5 +1,5 @@ import { HalfFloatType, LinearFilter, NearestFilter, RenderTarget, Texture, Vector2, QuadMesh, NodeMaterial, TempNode, RendererUtils } from 'three/webgpu'; -import { abs, Fn, NodeUpdateType, uv, uniform, convertToTexture, varyingProperty, vec2, vec4, modelViewProjection, passTexture, max, step, dot, float, texture, If, Loop, int, Break, sqrt, sign, mix } from 'three/tsl'; +import { abs, Fn, NodeUpdateType, uv, uniform, convertToTexture, vec2, vec4, passTexture, max, step, dot, float, texture, If, Loop, int, Break, sqrt, sign, mix } from 'three/tsl'; const _quadMesh = /*@__PURE__*/ new QuadMesh(); const _size = /*@__PURE__*/ new Vector2(); @@ -292,25 +292,11 @@ class SMAANode extends TempNode { // edges - const SMAAEdgeDetectionVS = Fn( () => { + const SMAAEdgeDetection = Fn( () => { - const vOffset0 = vec4( uvNode.xy, uvNode.xy ).add( vec4( this._invSize.xy, this._invSize.xy ).mul( vec4( - 1.0, 0.0, 0.0, - 1.0 ) ) ); - const vOffset1 = vec4( uvNode.xy, uvNode.xy ).add( vec4( this._invSize.xy, this._invSize.xy ).mul( vec4( 1.0, 0.0, 0.0, 1.0 ) ) ); - const vOffset2 = vec4( uvNode.xy, uvNode.xy ).add( vec4( this._invSize.xy, this._invSize.xy ).mul( vec4( - 2.0, 0.0, 0.0, - 2.0 ) ) ); - - varyingProperty( 'vec4', 'vOffset0' ).assign( vOffset0 ); - varyingProperty( 'vec4', 'vOffset1' ).assign( vOffset1 ); - varyingProperty( 'vec4', 'vOffset2' ).assign( vOffset2 ); - - return modelViewProjection; - - } ); - - const SMAAEdgeDetectionFS = Fn( () => { - - const vOffset0 = varyingProperty( 'vec4', 'vOffset0' ); - const vOffset1 = varyingProperty( 'vec4', 'vOffset1' ); - const vOffset2 = varyingProperty( 'vec4', 'vOffset2' ); + const vOffset0 = vec4( uvNode.xy, uvNode.xy ).add( vec4( this._invSize.xy, this._invSize.xy ).mul( vec4( - 1.0, 0.0, 0.0, - 1.0 ) ) ).toVertexStage(); + const vOffset1 = vec4( uvNode.xy, uvNode.xy ).add( vec4( this._invSize.xy, this._invSize.xy ).mul( vec4( 1.0, 0.0, 0.0, 1.0 ) ) ).toVertexStage(); + const vOffset2 = vec4( uvNode.xy, uvNode.xy ).add( vec4( this._invSize.xy, this._invSize.xy ).mul( vec4( - 2.0, 0.0, 0.0, - 2.0 ) ) ).toVertexStage(); const threshold = vec2( SMAA_THRESHOLD, SMAA_THRESHOLD ); @@ -513,32 +499,16 @@ class SMAANode extends TempNode { } ); - const SMAAWeightsVS = Fn( () => { + const SMAAWeights = Fn( () => { - const vPixcoord = uvNode.xy.div( this._invSize ); + const vPixcoord = uvNode.xy.div( this._invSize ).toVertexStage(); // We will use these offsets for the searches later on (see @PSEUDO_GATHER4): - const vOffset0 = vec4( uvNode.xy, uvNode.xy ).add( vec4( this._invSize.xy, this._invSize.xy ).mul( vec4( - 0.25, - 0.125, 1.25, - 0.125 ) ) ).toVar(); - const vOffset1 = vec4( uvNode.xy, uvNode.xy ).add( vec4( this._invSize.xy, this._invSize.xy ).mul( vec4( - 0.125, - 0.25, - 0.125, 1.25 ) ) ).toVar(); + const vOffset0 = vec4( uvNode.xy, uvNode.xy ).add( vec4( this._invSize.xy, this._invSize.xy ).mul( vec4( - 0.25, - 0.125, 1.25, - 0.125 ) ) ).toVertexStage(); + const vOffset1 = vec4( uvNode.xy, uvNode.xy ).add( vec4( this._invSize.xy, this._invSize.xy ).mul( vec4( - 0.125, - 0.25, - 0.125, 1.25 ) ) ).toVertexStage(); // And these for the searches, they indicate the ends of the loops: - const vOffset2 = vec4( vOffset0.xz, vOffset1.yw ).add( vec4( - 2.0, 2.0, - 2.0, 2.0 ).mul( vec4( this._invSize.xx, this._invSize.yy ) ).mul( float( SMAA_MAX_SEARCH_STEPS ) ) ).toVar(); - - varyingProperty( 'vec2', 'vPixcoord' ).assign( vPixcoord ); - varyingProperty( 'vec4', 'vOffset0' ).assign( vOffset0 ); - varyingProperty( 'vec4', 'vOffset1' ).assign( vOffset1 ); - varyingProperty( 'vec4', 'vOffset2' ).assign( vOffset2 ); - - return modelViewProjection; - - } ); - - const SMAAWeightsFS = Fn( () => { - - const vPixcoord = varyingProperty( 'vec2', 'vPixcoord' ); - const vOffset0 = varyingProperty( 'vec4', 'vOffset0' ); - const vOffset1 = varyingProperty( 'vec4', 'vOffset1' ); - const vOffset2 = varyingProperty( 'vec4', 'vOffset2' ); + const vOffset2 = vec4( vOffset0.xz, vOffset1.yw ).add( vec4( - 2.0, 2.0, - 2.0, 2.0 ).mul( vec4( this._invSize.xx, this._invSize.yy ) ).mul( float( SMAA_MAX_SEARCH_STEPS ) ) ).toVertexStage(); const weights = vec4( 0.0, 0.0, 0.0, 0.0 ).toVar(); const subsampleIndices = vec4( 0.0, 0.0, 0.0, 0.0 ).toVar(); @@ -623,22 +593,9 @@ class SMAANode extends TempNode { // blend - const SMAABlendVS = Fn( () => { - - //const vOffset0 = vec4( uvNode.xy, uvNode.xy ).add( vec4( this._invSize.xy, this._invSize.xy ).mul( vec4( - 1.0, 0.0, 0.0, - 1.0 ) ) ); - const vOffset1 = vec4( uvNode.xy, uvNode.xy ).add( vec4( this._invSize.xy, this._invSize.xy ).mul( vec4( 1.0, 0.0, 0.0, 1.0 ) ) ); - - //varyingProperty( 'vec4', 'vOffset0' ).assign( vOffset0 ); - varyingProperty( 'vec4', 'vOffset1' ).assign( vOffset1 ); - - return modelViewProjection; - - } ); - - const SMAABlendFS = Fn( () => { + const SMAABlend = Fn( () => { - //const vOffset0 = varyingProperty( 'vec4', 'vOffset0' ); - const vOffset1 = varyingProperty( 'vec4', 'vOffset1' ); + const vOffset1 = vec4( uvNode.xy, uvNode.xy ).add( vec4( this._invSize.xy, this._invSize.xy ).mul( vec4( 1.0, 0.0, 0.0, 1.0 ) ) ).toVertexStage(); const result = vec4().toVar(); // Fetch the blending weights for current pixel: @@ -694,16 +651,13 @@ class SMAANode extends TempNode { } ); - this._materialEdges.vertexNode = SMAAEdgeDetectionVS().context( builder.getSharedContext() ); - this._materialEdges.fragmentNode = SMAAEdgeDetectionFS().context( builder.getSharedContext() ); + this._materialEdges.fragmentNode = SMAAEdgeDetection().context( builder.getSharedContext() ); this._materialEdges.needsUpdate = true; - this._materialWeights.vertexNode = SMAAWeightsVS().context( builder.getSharedContext() ); - this._materialWeights.fragmentNode = SMAAWeightsFS().context( builder.getSharedContext() ); + this._materialWeights.fragmentNode = SMAAWeights().context( builder.getSharedContext() ); this._materialWeights.needsUpdate = true; - this._materialBlend.vertexNode = SMAABlendVS().context( builder.getSharedContext() ); - this._materialBlend.fragmentNode = SMAABlendFS().context( builder.getSharedContext() ); + this._materialBlend.fragmentNode = SMAABlend().context( builder.getSharedContext() ); this._materialBlend.needsUpdate = true; return this._textureNode; diff --git a/examples/screenshots/webgpu_postprocessing_smaa.jpg b/examples/screenshots/webgpu_postprocessing_smaa.jpg index 37d2f4831dcbcf4ad542e8d03a99c4a26839a731..5a76fd8fda078ab832d282db9d649ad07e63f7bc 100644 GIT binary patch delta 14680 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