Version: Unity 6.0 (6000.0)
言語 : 日本語
URP でのスクリプトによるレンダーパスの挿入
URP のインジェクションポイントに関するリファレンス

Restrict a render pass to a scene area in URP

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:

  1. 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;
            }
        }
    }
    
  2. 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
    {
    }
    
  3. In the Hierarchy window, select the Add (+) button, then select GameObject > Volume > Box Volume.

  4. In the Inspector window for the new box volume, under Volume, select New to create a new volume profile.

  5. Select Add override, then select your volume override component, for example My Volume Override.

  6. 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);
    }
    
  7. 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;
        }
    }
    
  8. 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.

Additional resources

URP でのスクリプトによるレンダーパスの挿入
URP のインジェクションポイントに関するリファレンス