From 0e11ca886d1d9380d0f006a9f2d65baab39ed286 Mon Sep 17 00:00:00 2001 From: mrdoob Date: Wed, 11 Feb 2026 01:10:43 -0800 Subject: [PATCH 1/3] SSRNode: Use squared roughness for blur LOD and simplify pointPlaneDistance (#32993) Co-authored-by: Claude Opus 4.6 --- examples/jsm/tsl/display/SSRNode.js | 79 +++++++----------- .../screenshots/webgpu_postprocessing_ssr.jpg | Bin 28207 -> 26549 bytes 2 files changed, 30 insertions(+), 49 deletions(-) diff --git a/examples/jsm/tsl/display/SSRNode.js b/examples/jsm/tsl/display/SSRNode.js index 4d734f6c3e5c2e..172a05dc144b41 100644 --- a/examples/jsm/tsl/display/SSRNode.js +++ b/examples/jsm/tsl/display/SSRNode.js @@ -1,5 +1,5 @@ import { HalfFloatType, RenderTarget, Vector2, RendererUtils, QuadMesh, TempNode, NodeMaterial, NodeUpdateType, LinearFilter, LinearMipmapLinearFilter } from 'three/webgpu'; -import { texture, reference, viewZToPerspectiveDepth, logarithmicDepthToViewZ, getScreenPosition, getViewPosition, mul, div, cross, float, Break, Loop, int, max, abs, sub, If, dot, reflect, normalize, screenCoordinate, nodeObject, Fn, passTexture, uv, uniform, perspectiveDepthToViewZ, orthographicDepthToViewZ, vec2, vec3, vec4 } from 'three/tsl'; +import { texture, reference, viewZToPerspectiveDepth, logarithmicDepthToViewZ, getScreenPosition, getViewPosition, mul, div, cross, float, Continue, Break, Loop, int, max, abs, sub, If, dot, reflect, normalize, screenCoordinate, nodeObject, Fn, passTexture, uv, uniform, perspectiveDepthToViewZ, orthographicDepthToViewZ, vec2, vec3, vec4 } from 'three/tsl'; import { boxBlur } from './boxBlur.js'; const _quadMesh = /*@__PURE__*/ new QuadMesh(); @@ -262,7 +262,6 @@ class SSRNode extends TempNode { this._copyMaterial = new NodeMaterial(); this._copyMaterial.name = 'SSRNode.Copy'; - /** * The result of the effect is represented as a separate texture node. * @@ -271,13 +270,25 @@ class SSRNode extends TempNode { */ this._textureNode = passTexture( this, this._ssrRenderTarget.texture ); + let blurredTextureNode = null; + + if ( this.roughnessNode !== null ) { + + const mips = this._blurRenderTarget.texture.mipmaps.length - 1; + const r = float( this.roughnessNode ); + const lod = r.mul( r ).mul( mips ).clamp( 0, mips ); + + blurredTextureNode = passTexture( this, this._blurRenderTarget.texture ).level( lod ); + + } + /** * Holds the blurred SSR reflections. * * @private - * @type {?Node} + * @type {?PassTextureNode} */ - this._blurredTextureNode = null; + this._blurredTextureNode = blurredTextureNode; } @@ -389,6 +400,7 @@ class SSRNode extends TempNode { // https://en.wikipedia.org/wiki/Plane_(geometry) // http://paulbourke.net/geometry/pointlineplane/ + // planeNormal is already normalized, so denominator is 1 const d = mul( planeNormal.x, planePoint.x ).add( mul( planeNormal.y, planePoint.y ) ).add( mul( planeNormal.z, planePoint.z ) ).negate().toVar(); const distance = mul( planeNormal.x, point.x ).add( mul( planeNormal.y, point.y ) ).add( mul( planeNormal.z, point.z ) ).add( d ); return distance; @@ -469,6 +481,9 @@ class SSRNode extends TempNode { // below variables are used to control the raymarching process + // total length of the ray + const totalLen = d1.sub( d0 ).length().toVar(); + // offset in x and y direction const xLen = d1.x.sub( d0.x ).toVar(); const yLen = d1.y.sub( d0.y ).toVar(); @@ -476,9 +491,7 @@ class SSRNode extends TempNode { // determine the larger delta // The larger difference will help to determine how much to travel in the X and Y direction each iteration and // how many iterations are needed to travel the entire ray - // scale step count by distance - distant surfaces need less precision (0.5 to 1.0 multiplier) - const distanceFactor = float( 1 ).sub( depth.mul( 0.5 ) ).clamp( 0.5, 1 ); - const totalStep = int( max( abs( xLen ), abs( yLen ) ).mul( this.quality.clamp() ).mul( distanceFactor ) ).toConst(); + const totalStep = int( max( abs( xLen ), abs( yLen ) ).mul( this.quality.clamp() ) ).toConst(); // step sizes in the x and y directions const xSpan = xLen.div( totalStep ).toVar(); @@ -486,14 +499,10 @@ class SSRNode extends TempNode { const output = vec4( 0 ).toVar(); - // incremental interpolation factor - const sStep = float( 1 ).div( float( totalStep ) ); - const s = sStep.toVar(); // start at sStep since loop starts at i=1 - // the actual ray marching loop // starting from d0, the code gradually travels along the ray and looks for an intersection with the geometry. // it does not exceed d1 (the maximum ray extend) - Loop( { start: int( 1 ), end: totalStep }, ( { i } ) => { + Loop( totalStep, ( { i } ) => { // advance on the ray by computing a new position in screen coordinates const xy = vec2( d0.x.add( xSpan.mul( float( i ) ) ), d0.y.add( ySpan.mul( float( i ) ) ) ).toVar(); @@ -512,6 +521,9 @@ class SSRNode extends TempNode { const viewReflectRayZ = float( 0 ).toVar(); + // normalized distance between the current position xy and the starting point d0 + const s = xy.sub( d0 ).length().div( totalLen ); + // depending on the camera type, we now compute the z-coordinate of the reflected ray at the current step in view space If( this._isPerspectiveCamera, () => { @@ -547,9 +559,9 @@ class SSRNode extends TempNode { If( dot( viewReflectDir, vN ).greaterThanEqual( 0 ), () => { - // the reflected ray is hitting a backface (normal pointing away from ray), - // treat as opaque surface that blocks the ray - Break(); + // the reflected ray is pointing towards the same side as the fragment's normal (current ray position), + // which means it wouldn't reflect off the surface. The loop continues to the next step for the next ray sample. + Continue(); } ); @@ -575,19 +587,15 @@ class SSRNode extends TempNode { const fresnelCoe = div( dot( viewIncidentDir, viewReflectDir ).add( 1 ), 2 ); op.mulAssign( fresnelCoe ); - // output: RGB = color * opacity (premultiplied), A = normalized distance + // output const reflectColor = this.colorNode.sample( uvNode ); - const normalizedDistance = distance.div( this.maxDistance ).clamp( 0, 1 ); - output.assign( vec4( reflectColor.rgb.mul( op ), normalizedDistance ) ); + output.assign( vec4( reflectColor.rgb.mul( op ), 1 ) ); Break(); } ); } ); - // advance interpolation factor - s.addAssign( sStep ); - } ); return output; @@ -607,33 +615,6 @@ class SSRNode extends TempNode { this._copyMaterial.fragmentNode = reflectionBuffer; this._copyMaterial.needsUpdate = true; - // distance-aware blur sampling - - if ( this.roughnessNode !== null ) { - - const blurBuffer = texture( this._blurRenderTarget.texture ); - const mips = this._blurRenderTarget.texture.mipmaps.length - 1; - - // sample distance from unblurred SSR alpha and use roughness² * distance for LOD - // roughness² matches GGX microfacet distribution behavior - const distanceAwareSample = Fn( () => { - - // get distance from the unblurred SSR texture's alpha channel - const reflectionDistance = reflectionBuffer.sample( uvNode ).a; - const r = float( this.roughnessNode ); - // squared roughness for more physically accurate falloff (GGX-like) - const lod = r.mul( r ).mul( reflectionDistance ).mul( mips ).clamp( 0, mips ); - const blurred = blurBuffer.sample( uvNode ).level( lod ); - - // output: RGB is premultiplied color, keep alpha as distance for potential further use - return blurred; - - } ); - - this._blurredTextureNode = distanceAwareSample(); - - } - // return this.getTextureNode(); @@ -672,4 +653,4 @@ export default SSRNode; * @param {?Camera} [camera=null] - The camera the scene is rendered with. * @returns {SSRNode} */ -export const ssr = ( colorNode, depthNode, normalNode, metalnessNode, roughnessNode = null, camera = null ) => nodeObject( new SSRNode( nodeObject( colorNode ), nodeObject( depthNode ), nodeObject( normalNode ), nodeObject( metalnessNode ), nodeObject( roughnessNode ), camera ) ); +export const ssr = ( colorNode, depthNode, normalNode, metalnessNode, roughnessNode = null, camera = null ) => nodeObject( new SSRNode( nodeObject( colorNode ), nodeObject( depthNode ), nodeObject( normalNode ), nodeObject( metalnessNode ), nodeObject( roughnessNode ), camera ) ); \ No newline at end of file diff --git a/examples/screenshots/webgpu_postprocessing_ssr.jpg b/examples/screenshots/webgpu_postprocessing_ssr.jpg index 14688a8c3f02725bcb6913bf7feb156d04ea7fe6..c6756672594a058dc484844dccd8d486e9433dd5 100644 GIT binary patch delta 23324 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 delta 25003 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 Date: Wed, 11 Feb 2026 11:17:03 +0100 Subject: [PATCH 2/3] Examples: Clean up. (#32994) --- .../screenshots/webgpu_skinning_points.jpg | Bin 22944 -> 12441 bytes examples/webgpu_compute_reduce.html | 2 +- examples/webgpu_lights_phong.html | 4 ++-- examples/webgpu_skinning_points.html | 1 + test/e2e/puppeteer.js | 1 + 5 files changed, 5 insertions(+), 3 deletions(-) diff --git a/examples/screenshots/webgpu_skinning_points.jpg b/examples/screenshots/webgpu_skinning_points.jpg index 004c541c892e04e7b3c346350661a52d7bec7b2b..62a405c22932c98851727457f08d089153b3689b 100644 GIT binary patch delta 9611 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

Y+yAxvg%yw(WJp3<%^=34Fpe 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 E1LlZ6(f|Me delta 20261 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 diff --git a/examples/webgpu_compute_reduce.html b/examples/webgpu_compute_reduce.html index 2c61c238dad8ac..cd2038c64698b5 100644 --- a/examples/webgpu_compute_reduce.html +++ b/examples/webgpu_compute_reduce.html @@ -677,7 +677,7 @@

Subgroup Reduction Explanation

const fnDef = Fn( () => { - const inputSize = uint( inputBuffer.bufferCount.length ); + const inputSize = uint( inputBuffer.bufferCount ); const rowOffset = workgroupId.x.mul( rowSize ); // If the current rows elements exceed the bounds of the input diff --git a/examples/webgpu_lights_phong.html b/examples/webgpu_lights_phong.html index 56f71116dfda0a..2184bfb197c1df 100644 --- a/examples/webgpu_lights_phong.html +++ b/examples/webgpu_lights_phong.html @@ -12,11 +12,11 @@
- three.jsPhong + three.jsPhong Material
- Left: Red lights - Center: All lights - Right: blue light + Selective lights with Phong materials. diff --git a/examples/webgpu_skinning_points.html b/examples/webgpu_skinning_points.html index 02c4ad1cd28a07..c756cf23847bab 100644 --- a/examples/webgpu_skinning_points.html +++ b/examples/webgpu_skinning_points.html @@ -85,6 +85,7 @@ materialPoints.opacityNode = shapeCircle(); materialPoints.sizeNode = pointSpeedAttribute.length().exp().min( 5 ).mul( 5 ).add( 1 ); materialPoints.sizeAttenuation = false; + materialPoints.alphaTest = 0.5; const updateSkinningPoints = Fn( () => { diff --git a/test/e2e/puppeteer.js b/test/e2e/puppeteer.js index a4c621a1fe1e81..b2aff0101c0114 100644 --- a/test/e2e/puppeteer.js +++ b/test/e2e/puppeteer.js @@ -19,6 +19,7 @@ const exceptionList = [ // Needs investigation 'physics_rapier_instancing', + 'physics_jolt_instancing', 'webgl_shadowmap', 'webgl_postprocessing_dof2', 'webgl_postprocessing_glitch', From 6e6b02c7acfbdce5b016f1cd12deb975a0dc28e6 Mon Sep 17 00:00:00 2001 From: Michael Herzog Date: Wed, 11 Feb 2026 11:23:00 +0100 Subject: [PATCH 3/3] Cache: Don't cache Blobs. (#32989) --- src/loaders/Cache.js | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/loaders/Cache.js b/src/loaders/Cache.js index e3a65d0c2f923a..9a8d58effbb0d5 100644 --- a/src/loaders/Cache.js +++ b/src/loaders/Cache.js @@ -35,6 +35,8 @@ const Cache = { if ( this.enabled === false ) return; + if ( isBlobURL( key ) ) return; + // log( 'Cache', 'Adding key:', key ); this.files[ key ] = file; @@ -52,6 +54,8 @@ const Cache = { if ( this.enabled === false ) return; + if ( isBlobURL( key ) ) return; + // log( 'Cache', 'Checking key:', key ); return this.files[ key ]; @@ -83,5 +87,29 @@ const Cache = { }; +/** + * Returns true if the given cache key contains the blob: scheme. + * + * @private + * @param {string} key - The cache key. + * @return {boolean} Whether the given cache key contains the blob: scheme or not. + */ +function isBlobURL( key ) { + + try { + + const urlString = key.slice( key.indexOf( ':' ) + 1 ); // remove type identifier + + const url = new URL( urlString ); + return url.protocol === 'blob:'; + + } catch ( e ) { + + // If the string is not a valid URL, it throws an error + return false; + + } + +} export { Cache };