To restrict a render pass to a specific area of a scene, add a volume to the scene, then add code to your render pass and your shader to check if the camera is inside the volume.
Follow these steps:
Update your shader code to enable or disable your custom rendering effect based on a Boolean value.
For example, add the following code to your shader:
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;
}
}
}
Create a script that implements the VolumeComponent class. This creates a volume override component that you can add to a volume.
using UnityEngine;
using UnityEngine.Rendering;
public class MyVolumeOverride : VolumeComponent
{
}
In the Hierarchy window, select the Add (+) button, then select GameObject > Volume > Box Volume.
In the Inspector window for the new box volume, under Volume, select New to create a new volume profile.
Select Add override, then select your volume override component, for example My Volume Override.
Add a property to the volume override script. Unity adds the property in the Inspector window of the volume override.
For example:
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);
}
In your custom pass, use the GetComponent API to get the volume override component and check the value of the property.
For example:
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;
}
}
Pass the value of the property to the variable you added to the shader code.
For example:
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);
}
}
Your custom rendering effect is now enabled when the camera is inside the volume, and disabled when the camera is outside the volume.