Skip to content

fix(examples): disable SSGINode temporal filtering under FSR3 - #14

Merged
DennisSmolek merged 1 commit into
mainfrom
fix-ssgi-temporal-filtering
Aug 6, 2026
Merged

fix(examples): disable SSGINode temporal filtering under FSR3#14
DennisSmolek merged 1 commit into
mainfrom
fix-ssgi-temporal-filtering

Conversation

@DennisSmolek

Copy link
Copy Markdown
Member

Problem

The SSGI examples (06, 09) show ghost streaks trailing off moving silhouettes — reported against the deployed gallery and reproduced headlessly on GPU at both render scale 1 and 2. The streaks are gated on SSGI being enabled.

Root cause

three's SSGINode.useTemporalFiltering defaults to true: it rotates the GI sampling pattern on a 6-frame cycle, and its own doc comment states that mode "requires the usage of TRAANode". Our examples deliberately have no TRAA — FSR3 is the temporal resolver — but FSR3 does not satisfy that contract: the per-frame GI swing inflates the variance-clip AABB exactly where GI gradients are strong (silhouette edges), so stale history survives the clip and streaks out of moving edges.

Fix

Set useTemporalFiltering = false in both examples — three's documented recipe for the no-TRAA case (static pattern + DenoiseNode, which both examples already run) — and correct the example header comments that claimed FSR3 resolves the rotation. CLAUDE.md gains the landmine note so this doesn't regress.

Verification (headless Chrome + CDP, Apple Metal)

  • A/B with filtering on vs off at render scale 1, SSGI-only, orbiting camera: streak bands + edge fringes with filtering on; clean with it off.
  • Post-fix: example 09 at ratio 2 with SSGI+SSR on, and example 06 switched to SSGI — clean silhouettes under motion. Trade is the documented one: static GI noise pattern visible as faint crosshatch under fast motion, converged by FSR3 when motion slows.
  • lint / typecheck pass; changes are examples + docs only.

Note: the fix: type will auto-publish a patch release on merge even though the npm package content is unchanged (examples aren't packaged) — flagged in review discussion, accepted.

🤖 Generated with Claude Code

three's SSGINode.useTemporalFiltering defaults to true — a 6-frame rotating
sample pattern whose own docs require a real TRAA to resolve. FSR3-as-resolver
does not satisfy that contract: the per-frame GI swing inflates the variance
clip at silhouettes and ghost-streaks off moving edges (GPU-verified A/B at
render scale 1 and 2, examples 06 + 09).

Switch both SSGI examples to three's documented no-TRAA recipe — static
pattern + DenoiseNode — with FSR3 converging the residual noise, and correct
the example comments that claimed FSR3 resolves the rotation. CLAUDE.md gains
the landmine note.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@DennisSmolek
DennisSmolek merged commit b5029b1 into main Aug 6, 2026
1 check passed
@DennisSmolek
DennisSmolek deleted the fix-ssgi-temporal-filtering branch August 6, 2026 16:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant