Ограничить проход рендеринга до области сцены в URP
Чтобы ограничить проход рендеринга определенной областью сцены, добавьте том в сцену, затем добавьте код в проход рендеринга и в свой шейдер, чтобы проверить, находится ли камера внутри тома.
Выполните следующие действия:
-
Обновите код шейдера, чтобы включить или отключить пользовательский эффект отображения на основе логического значения.
Например, добавьте в свой шейдер следующий код:
Pass { ... // Add a variable to enable or disable your custom rendering effect float _Enabled; ... float4 Frag(Varyings input) : SV_Target0 { ... // Return the color with the effect if the variable is 1, or the original color if the variable is 0 if (_Enabled == 1){ return colorWithEffect; } else { return originalColor; } } } -
Создайте скрипт, реализующий
VolumeComponentкласс. Так создаётся компонент переопределения объёма, который можно добавить к объёму.using UnityEngine; using UnityEngine.Rendering; public class MyVolumeOverride : VolumeComponent { } В окне Hierarchy выберите кнопку Добавить (+), а затем выберите GameObject > Том > Box Том.
В окне Inspector для нового бокс-тома в разделе Томвыберите Новый для создания нового профиля тома.
Выбрать Добавить переопределение, затем выберите компонент переопределения объёма, например Переопределение моего тома.
-
Добавьте свойство в скрипт переопределения объёма. Unity добавляет это свойство в Inspector окно переопределения объёма.
Например:
public class MyVolumeOverride : VolumeComponent { // Add an 'Effect Enabled' checkbox to the Volume Override, with a default value of true. public BoolParameter effectEnabled = new BoolParameter(true); } -
В вашем пользовательском пропуске используйте
GetComponentAPI для получения компонента переопределения объёма и проверки значения свойства.Например:
class myCustomPass : ScriptableRenderPass { ... public void Setup(Material material) { // Get the volume override component MyVolumeOverride myOverride = VolumeManager.instance.stack.GetComponent<MyVolumeOverride>(); // Get the value of the 'Effect Enabled' property bool effectStatus = myOverride.effectEnabled.overrideState ? myOverride.effectEnabled.value : false; } } -
Передайте значение свойства переменной, которую вы добавили в код шейдера.
Например:
class myCustomPass : ScriptableRenderPass { ... public void Setup(Material material) { MyVolumeOverride myOverride = VolumeManager.instance.stack.GetComponent<MyVolumeOverride>(); bool effectStatus = myOverride.effectEnabled.overrideState ? myOverride.effectEnabled.value : false; // Pass the value to the shader material.SetFloat("_Enabled", effectStatus ? 1 : 0); } }
Настраиваемый эффект рендеринга теперь включается, когда камера находится внутри тома, и отключается, когда камера находится за пределами тома.