diff --git a/com.unity.render-pipelines.universal/Runtime/UniversalAdditionalCameraData.cs b/com.unity.render-pipelines.universal/Runtime/UniversalAdditionalCameraData.cs
index bda4e11e1fc..68dc3492620 100644
--- a/com.unity.render-pipelines.universal/Runtime/UniversalAdditionalCameraData.cs
+++ b/com.unity.render-pipelines.universal/Runtime/UniversalAdditionalCameraData.cs
@@ -111,11 +111,14 @@ public static void SetVolumeFrameworkUpdateMode(this Camera camera, VolumeFramew
return;
}
+ bool requiredUpdatePreviously = cameraData.requiresVolumeFrameworkUpdate;
cameraData.volumeFrameworkUpdateMode = mode;
// We only update the local volume stacks for cameras set to ViaScripting.
// Otherwise it will be updated in every frame.
- if (!cameraData.requiresVolumeFrameworkUpdate)
+ // We also check the previous value to make sure we're not updating when
+ // switching between Camera ViaScripting and the URP Asset set to ViaScripting
+ if (requiredUpdatePreviously && !cameraData.requiresVolumeFrameworkUpdate)
{
camera.UpdateVolumeStack(cameraData);
}
@@ -161,6 +164,27 @@ public static void UpdateVolumeStack(this Camera camera, UniversalAdditionalCame
VolumeManager.instance.Update(cameraData.volumeStack, trigger, layerMask);
}
+ ///
+ /// Destroys the volume stack for this camera.
+ ///
+ ///
+ public static void DestroyVolumeStack(this Camera camera)
+ {
+ UniversalAdditionalCameraData cameraData = camera.GetUniversalAdditionalCameraData();
+ camera.DestroyVolumeStack(cameraData);
+ }
+
+ ///
+ /// Destroys the volume stack for this camera.
+ ///
+ ///
+ ///
+ public static void DestroyVolumeStack(this Camera camera, UniversalAdditionalCameraData cameraData)
+ {
+ cameraData.volumeStack.Dispose();
+ cameraData.volumeStack = null;
+ }
+
///
/// Returns the mask and trigger assigned for volumes on the camera.
///
diff --git a/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipeline.cs b/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipeline.cs
index 28772dadb69..32222f9be1e 100644
--- a/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipeline.cs
+++ b/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipeline.cs
@@ -664,6 +664,15 @@ static void UpdateVolumeFramework(Camera camera, UniversalAdditionalCameraData a
}
// When we want to update the volumes every frame...
+
+ // We destroy the volumeStack in the additional camera data, if present, to make sure
+ // it gets recreated and initialized if the update mode gets later changed to ViaScripting...
+ if (additionalCameraData && additionalCameraData.volumeStack != null)
+ {
+ camera.DestroyVolumeStack(additionalCameraData);
+ }
+
+ // Get the mask + trigger and update the stack
camera.GetVolumeLayerMaskAndTrigger(additionalCameraData, out LayerMask layerMask, out Transform trigger);
VolumeManager.instance.ResetMainStack();
VolumeManager.instance.Update(trigger, layerMask);