"Geometry under an IsStatic root samples its lighting once, at creation"
▸ SYMPTOM
You run a lighting A/B on static geometry. You mutate a light component live, then re-observe the geometry, for example with a screenshot comparison. The geometry shows no change.
You raise the delta and rewrite the value several times. Still no change. The result reads as this light does not affect this surface, so you conclude the light or the surface is wrong.
▸ CAUSE
Geometry parented under an IsStatic root samples its lit appearance at creation time. It bakes that appearance once and never resamples it. A runtime write to a light component does not reach it, because the geometry is not re-reading lighting at all after the first bake.
So the A/B tests nothing. Every live write lands after the one sample the geometry ever takes. The screenshot pair is identical because the static batch is identical, not because the light delta had no effect.
▸ FIX
Drive any lighting change on static geometry through the world build, not a live component write.
- Regenerate the static batches to apply a lighting change. Run the command that rebuilds or recompiles the scene's static geometry. The rebuild is the step that re-samples lighting for
IsStaticcontent. - Do not A/B static geometry by mutating a light at runtime. A live component write changes the light, but the baked geometry keeps its creation-time sample, so the comparison is blind.
- Move the geometry off the
IsStaticroot if you need live lighting. Non-static geometry samples lighting per frame and shows a runtime light change at once.
▸ WHY IT WORKS
The bake is a one-time sample taken at creation. Nothing on the static path reads lighting again, so a later light write has no surface to change. The world build re-creates the static batch, which takes a fresh sample and folds the new lighting in. Moving the geometry off the static root removes the bake, so the geometry reads lighting live and every write shows up.
- Published