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);