docs.unity3d.com
Search Results for

    Show / Hide Table of Contents

    Blit Camera color texture to RTHandle

    This page describes the operation of blitting a camera color texture to an output texture, and setting the output texture as a global property. The shaders in the Scene use the global texture. The description uses the BlitToRTHandle scene from the URP package samples.

    The code samples on the page are from the following Scene from the URP Package Samples:

    * Assets > Samples > Universal RP > 14.0.9 > URP Package Samples > RendererFeatures > BlitToRTHandle
    

    The sample Scene uses the following assets to perform the blit operation:

    • A scriptable Renderer Feature that enqueues a render pass for execution.

    • A render pass that blits a camera color texture to an output texture, and sets the output texture as a global property.

    Import URP Package Samples to access the complete source code and the Scene.

    For general information on the blit operation, refer to URP blit best practices.

    Define RTHandles in a render pass

    The ScriptableRenderPass in the sample implementation defines the RTHandle variables for storing the input and the output textures.

    private RTHandle m_InputHandle;
    private RTHandle m_OutputHandle;
    

    Configure the input and output textures

    This section describes how the sample uses the RTHandle variables to configure the input and output textures.

    Input texture

    In this example, the Renderer Feature uses the SetInput method in the render pass to set the input texture:

    public void SetInput(RTHandle src)
    {
        // The Renderer Feature uses this variable to set the input RTHandle.
        m_InputHandle = src;
    }
    

    The Renderer Feature calls the SetInput method in the SetupRenderPasses method:

    public override void SetupRenderPasses(ScriptableRenderer renderer, in RenderingData renderingData)
    {
        if (renderingData.cameraData.cameraType != CameraType.Game)
            return;
        
        m_CopyColorPass.SetInput(renderer.cameraColorTargetHandle);
    }
    
    Note

    To set the m_InputHandle variable directly in the render pass, without calling the SetInput method, use the following code in the Execute method:

    m_InputHandle = renderingData.cameraData.renderer.cameraColorTargetHandle;
    

    Output texture

    The Configure method configures the output texture for the blit operation.

    The ReAllocateIfNeeded method creates a temporary render texture within the RTHandle system.

    public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor)
    {
        // Configure the custom RTHandle
        var desc = cameraTextureDescriptor;
        desc.depthBufferBits = 0;
        desc.msaaSamples = 1;
        RenderingUtils.ReAllocateIfNeeded(ref m_OutputHandle, desc, FilterMode.Bilinear, TextureWrapMode.Clamp, name: k_OutputName );
        
        // Set the RTHandle as the output target
        ConfigureTarget(m_OutputHandle);
    }
    

    Bind a source texture with the Blitter API

    By default, the Blitter API binds a source texture with the name _BlitTexture in the Blitter.BlitCameraTexture method. The example uses this texture for the m_InputHandle variable.

    The Shader Graph for the Material that the Renderer Feature uses contains the _BlitTexture property:

    _BlitTexture property in Shader Graph
    _BlitTexture property in Shader Graph

    Note

    In this particular example, you can achieve the same effect by using the URP Sample Buffer node instead of the Sample Texture 2D node. In the URP Sample Buffer node, set Source Buffer to BlitSource, and the input value to Default.

    Note

    If you want to perform a direct copy of the input texture without applying any effects, it's not necessary to provide a Material as a parameter to the BlitCameraTexture method. You can use the following code instead of the Blitter.BlitCameraTexture line in the sample:

    Blitter.BlitCameraTexture(cmd, m_InputHandle, m_OutputHandle, 0, true);
    

    Refer to the following page for more information on the Blitter API: UnityEngine.Rendering.Blitter.

    Perform the blit operation

    In the render pass, the BlitCameraTexture method from the Blitter API performs the blit operation.

    using (new ProfilingScope(cmd, m_ProfilingSampler))
    {
        // Blit the input RTHandle to the output one
        Blitter.BlitCameraTexture(cmd, m_InputHandle, m_OutputHandle, m_Material, 0);
    
        // Make the output texture available for the shaders in the scene
        cmd.SetGlobalTexture(m_OutputId, m_OutputHandle.nameID);
    }
    

    Additional resources

    • Perform a full screen blit in URP

      This page describes a basic blit operation and provides a complete step-by-step description of the implementation.

    • Blit multiple RTHandle textures and draw them on the screen

      This page describes a more complex blit operation that uses multiple textures defined as RTHandle.

    In This Article
    Back to top
    Copyright © 2025 Unity Technologies — Trademarks and terms of use
    • Legal
    • Privacy Policy
    • Cookie Policy
    • Do Not Sell or Share My Personal Information
    • Your Privacy Choices (Cookie Settings)