fix: PT-9 - SVGF disocclusion seeding + ReSTIR default-on (indoor motion noise)#96
Merged
Merged
Conversation
A true disocclusion started from the raw 1-spp sample with variance EXACTLY zero (m2 - m1 squared of a single value), so freshly streamed-in pixels - the whole viewport periphery whenever the camera translates - showed raw path noise until history rebuilt. Indoors (bounce-dominated light, the shooter house) that read as a salt-and-pepper ring around a clean centre, worst at low frame rates where history rebuilds slowest. A newborn pixel usually sits next to texels holding converged history for the very same surface: the wall streaming in at the screen edge continues inward. accum[] and moments[] are the previous frame buffers, race-free to read at any texel, so the temporal kernel now borrows from depth-consistent, converged (n >= 4) neighbours in a 5x5 window, weighted by history length, and inherits half their history (capped at 8) - the canonical 1/N blend then folds real fresh samples in over the next frames. A pixel with no depth-compatible neighbour (a genuinely new surface rounding a doorway) keeps the honest raw start. Realtime mode only; progressive accumulation is untouched. ReSTIR DI (PT-4) flips to ON by default: interiors carry 7+ point lights and uniform 1-of-N NEE picks the light that matters for a pixel ~6% of the time; the indoor A/B showed a visible win at no measurable frame cost (24 vs 25 fps). BLOOM_PT_RESTIR=0 restores plain NEE. Verified: golden_pt_progressive + golden_pt_realtime_motion both pass; panning indoor capture (shooter INDOORCAM harness) shows the disocclusion band gone at unchanged fps; outdoor RT full-run smoke clean. Claude-Session: https://claude.ai/code/session_018574BdCfSjdpNK3WLgx1hP
|
Caution Review failedThe pull request is closed. ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (2)
📝 WalkthroughWalkthroughThe renderer now enables ReSTIR DI by default and seeds missing SVGF temporal history from valid neighboring trace texels during path tracing. ChangesRenderer path tracing
Estimated code review effort: 2 (Simple) | ~10 minutes Possibly related PRs
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
82 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
A true disocclusion started from the raw 1-spp sample with variance
EXACTLY zero (m2 - m1 squared of a single value), so freshly
streamed-in pixels - the whole viewport periphery whenever the camera
translates - showed raw path noise until history rebuilt. Indoors
(bounce-dominated light, the shooter house) that read as a
salt-and-pepper ring around a clean centre, worst at low frame rates
where history rebuilds slowest.
A newborn pixel usually sits next to texels holding converged history
for the very same surface: the wall streaming in at the screen edge
continues inward. accum[] and moments[] are the previous frame
buffers, race-free to read at any texel, so the temporal kernel now
borrows from depth-consistent, converged (n >= 4) neighbours in a 5x5
window, weighted by history length, and inherits half their history
(capped at 8) - the canonical 1/N blend then folds real fresh samples
in over the next frames. A pixel with no depth-compatible neighbour (a
genuinely new surface rounding a doorway) keeps the honest raw start.
Realtime mode only; progressive accumulation is untouched.
ReSTIR DI (PT-4) flips to ON by default: interiors carry 7+ point
lights and uniform 1-of-N NEE picks the light that matters for a pixel
~6% of the time; the indoor A/B showed a visible win at no measurable
frame cost (24 vs 25 fps). BLOOM_PT_RESTIR=0 restores plain NEE.
Verified: golden_pt_progressive + golden_pt_realtime_motion both pass;
panning indoor capture (shooter INDOORCAM harness) shows the
disocclusion band gone at unchanged fps; outdoor RT full-run smoke
clean.
Claude-Session: https://claude.ai/code/session_018574BdCfSjdpNK3WLgx1hP
Summary by CodeRabbit
New Features
Bug Fixes