GI: alpha-blended windows flash brighter rapidly (GI off fixes it) #1438
Labels
No labels
amd
avatars
bug
builder
cannot-reproduce
crash
epic
feature
from-viewer
gl-removal
known-limitation
monitoring
parity
perf
platform
priority
critical
priority
high
priority
low
priority
medium
provenance
rendering
rt
status
in-progress
status
testing
status
up-next
triage
ui
upstream
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
sky_line/Slipstream#1438
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Owner report (2026-11-04, RTX 5090, current main-based test builds): with GI on (RenderVKGI), alpha-blended windows flash brighter rapidly. Turning GI off fixes it.
Context:
ccfcbd4946,95bda5a257bound emitter change spheres and kept denoiser history inside them), #1138 (ReSTIR emissive pulses).To find: which GI term the forward alpha shader reads (radiance cache lookup, probe/GI blend, hit-light / change tags), why it changes frame to frame for a static window (cache cell churn or eviction, change-tag resets, temporal reuse not applied to cache reads, alternating cache slots, light-change cuts, async GI lag mismatch with the frame that reads it), and fix it so translucent surfaces get temporally stable GI with no flashing, at no extra per-frame cost for scenes without blended surfaces.
Checked in world on a build that includes
cfff6e83e8: the window no longer flashes. Closing as fixed by that commit.What's left: a faint pulse. Only on glass in the shadow of a tree outside, and barely noticeable. The GI log at the time:
So every frame has change spheres, all 64 slots are in use (new ones merge into larger spheres), and there are no cache restarts. Glass cells inside a sphere only keep the 4-frame mean, and glass is fed by sparse samples, so a little noise remains. It reaches the glass 1:1 through
giForwardRefl'slum(E)/lum(probe)scale (clean_surface_light.glsl~212-219).Refinements from reading the code, if this ever needs more:
clean_deferred_light.comp(~4962) gives a 1-sample frame the same weight as a 200-sample frame. Keep a sample-weight total in the reserved wordgi_data[3cap+s].z, usealpha = acc.w / (Nw + acc.w), and capNwat a 4-frame equivalent inside spheres instead of cutting the window.giCacheForward, weight each corner bymin(Nw / Nmin, 1), so a young cell blends in against the probes instead of switching from 0 to 1.giCacheFindOrInsert(clean_gi_common.glsl~333) takes the first freed slot before checking the rest of the chain for the key. That can create a second cell with the same key, which costs one empty frame per occurrence.A/B levers if it gets reported again:
RenderVKGIDebug 6(magenta = cell in a sphere).RenderVKGISpecOcclusion 0.RenderVKGICacheFrames32 → 128.RenderVKGIFireflyClamp4 → 1.RenderVKGIRayLength, which shrinks the sphere padding.