Quick answer: LightProbeProxyVolume shows stale lighting because its Refresh Mode is not set to update when the object moves or lighting changes. Set Refresh Mode to Every Frame or call Update() manually after lighting changes. Ensure the Bounding Box mode covers the object correctly, Resolution is high enough to capture lighting variation, and light probes are baked with current lighting.
Here is how to fix a LightProbeProxyVolume that is not updating in Unity. You have a large object — a train car, a bridge, a dragon — and it looks uniformly lit even though it passes through areas with different lighting. You added an LPPV component to fix the flat lighting, but the result still looks wrong: one side of the object has lighting from where it was three seconds ago, or the entire object is too dark because the probes were sampled when it was inside a tunnel. The LPPV is not refreshing its probe data.
The Symptom
A LightProbeProxyVolume-equipped object shows incorrect lighting:
- Lighting does not change as the object moves between light probe zones
- Object retains lighting from its initial position
- Lighting snaps abruptly instead of transitioning smoothly
- Part of the object is correctly lit but another part is wrong
- LPPV works in the editor but shows wrong values in builds
The light probes themselves are correctly placed and baked — other objects using single-probe sampling show correct lighting. The issue is specific to the LPPV sampling.
How LPPV Works
The problem it solves. Without LPPV, Unity picks a single anchor point on a dynamic object and samples the nearest light probe. The entire object receives that one color. For small objects this is fine. For large objects that span multiple probe zones, the result is flat and wrong — a long hallway carpet lit uniformly from one end.
What LPPV does. It creates a 3D grid of sample points within the object’s bounding volume. At each grid point, it interpolates the surrounding light probes. The result is stored in a 3D texture. The shader samples this texture per-pixel, giving smooth lighting variation across the object’s surface.
When it samples. This is where the update problem lives. The LPPV has a Refresh Mode that controls when it re-samples the probes. If it samples once and never updates, the lighting is frozen at whatever the probes contained at that moment.
Fix 1: Set Refresh Mode Correctly
The LightProbeProxyVolume has three refresh modes:
- Automatic: Updates when the renderer becomes visible or when the transform moves. Should work for moving objects but can miss updates in some edge cases.
- Every Frame: Re-samples every frame. Most reliable but highest cost. Use for objects that must always have accurate lighting.
- Via Scripting: Only updates when you call
Update()manually. Most control, best for optimization.
LightProbeProxyVolume lppv = GetComponent<LightProbeProxyVolume>();
// Option 1: Always update (reliable, moderate cost)
lppv.refreshMode = LightProbeProxyVolume.RefreshMode.EveryFrame;
// Option 2: Manual update (best performance, most control)
lppv.refreshMode = LightProbeProxyVolume.RefreshMode.ViaScripting;
If using Via Scripting, call lppv.Update() when the object moves significantly or when lighting changes:
private Vector3 _lastPosition;
private LightProbeProxyVolume _lppv;
void LateUpdate()
{
float dist = Vector3.Distance(transform.position, _lastPosition);
if (dist > 1f) // update every 1 unit of movement
{
_lppv.Update();
_lastPosition = transform.position;
}
}
Fix 2: Correct the Bounding Box Mode
The LPPV samples probes within its bounding volume. If the volume does not cover the object, parts of the mesh sample from outside the LPPV grid and get wrong lighting.
- Auto Local: Uses the renderer’s local bounding box. Works for most objects.
- Auto World: Uses the renderer’s world-space bounding box. Use for objects that rotate significantly.
- Custom: Manually defined volume. Use when the renderer bounds are wrong (common with SkinnedMeshRenderers).
lppv.boundingBoxMode = LightProbeProxyVolume.BoundingBoxMode.AutoLocal;
// Or set custom bounds
lppv.boundingBoxMode = LightProbeProxyVolume.BoundingBoxMode.Custom;
lppv.originCustom = Vector3.zero;
lppv.sizeCustom = new Vector3(10f, 3f, 4f); // covers the full object
For long objects like trains or bridges, Custom mode with a manually-sized volume often gives the best results. Auto modes can produce tight bounds that miss extremities.
Fix 3: Increase Resolution
The Resolution setting controls how many sample points exist in the 3D grid. Low resolution means fewer samples, which means the lighting variation is coarse and can miss fine lighting changes.
lppv.resolutionMode = LightProbeProxyVolume.ResolutionMode.Custom;
lppv.gridResolutionX = 8;
lppv.gridResolutionY = 4;
lppv.gridResolutionZ = 4;
Higher resolution means more probe interpolations per update (CPU cost) and a larger 3D texture (GPU memory). For most objects, 4–8 samples per axis is sufficient. Only increase beyond that for very large objects with dramatic lighting variation.
Use Auto resolution mode to let Unity choose based on object size, or Custom to set exact values.
Fix 4: Rebake Light Probes
The LPPV samples baked light probe data. If the light probes are stale (baked with old lighting, or not baked at all), the LPPV faithfully reproduces stale data. After changing any baked or mixed-mode lights:
- Open the Lighting window (Window > Rendering > Lighting)
- Click Generate Lighting
- Wait for the bake to complete
- Verify probe visualization shows correct colors in the Scene View
You can visualize individual probe values by selecting the Light Probe Group and enabling the gizmo. Each probe sphere shows its captured lighting. If probes near your object show wrong colors, the LPPV will too.
Renderer Configuration
The MeshRenderer or SkinnedMeshRenderer must be configured to use the LPPV. In the renderer’s Inspector:
- Light Probes: Set to
Use Proxy Volume - Proxy Volume Override: Leave empty to use the LPPV on the same GameObject, or assign a different GameObject’s LPPV
If Light Probes is set to Blend Probes (default), the renderer ignores the LPPV entirely and uses single-point probe sampling.
“LPPV is the bridge between baked probes and large dynamic objects. If the bridge is not updating, check Refresh Mode first, Resolution second, bake status third.”
Related Issues
For light probe blending artifacts on small objects, adjust Light Probe Group placement density. For lighting differences between editor and builds, rebake lighting in the exact scene configuration used for builds. For objects receiving no probe lighting at all, verify they are within the convex hull of the Light Probe Group.
Refresh Mode Every Frame or manual Update(). Bounding Box covers the mesh. Resolution 4-8 per axis. Rebake probes after lighting changes. Renderer set to Use Proxy Volume.