Version: 6000.3
语言: 中文
优化渲染图
URP的渲染图表查看器窗口参考

在渲染图中使用 CommandBuffer 接口

您可以使用渲染图AddUnsafePassAPI 来使用 CommandBuffer 接口 API,例如SetRenderTarget在渲染图系统中渲染通道。

AddUnsafePassAPI 提供对 UnsafeCommandBuffer 的访问权限,从而可以访问更多CommandBuffer函数而不是 RasterCommandBuffer API。

注意:两者AddUnsafePassRasterCommandBuffer限制对某些人的访问commandBuffer函数,以便RenderGraph可以更好地优化框架。最重要的功能unsafeCommandbuffer允许您访问 ISSetRenderTarget.

如果您使用AddUnsafePassAPI,以下内容适用:

  • 您不能使用SetRenderAttachment方法RecordRenderGraph方法。用SetRenderTargetSetRenderFunc方法。
  • 渲染速度可能会变慢,因为 URP 无法优化渲染通道。例如,如果您的渲染通道写入活动颜色缓冲区,则 URP 无法检测到后续的渲染通道是否写入同一缓冲区。因此,URP 无法合并两个渲染通道,并且 GPU 会不必要地将缓冲区传入和传出内存。

创建不安全的渲染通道

要创建不安全的渲染通道,请按照下列步骤作:

  1. 在您的RecordRenderGraph方法,使用AddUnsafePass方法而不是AddRasterRenderPass方法。

    例如:

    using (var builder = renderGraph.AddUnsafePass<PassData>("My unsafe render pass", out var passData))
    
  2. 当您调用SetRenderFunc方法,使用UnsafeGraphContexttype 而不是RasterGraphContext.

    例如:

    builder.SetRenderFunc(
        (PassData passData, UnsafeGraphContext context) => ExecutePass(passData, context)
    );
    
  3. 如果渲染通道写入纹理,请将纹理添加为通道数据类中的字段。

    例如:

    private class PassData
    {
        internal TextureHandle textureToWriteTo;
    }
    
  4. 如果渲染通道写入纹理,请使用UseTexture方法。

    例如:

    builder.UseTexture(passData.textureToWriteTo, AccessFlags.Write);
    

您现在可以在SetRenderFunc方法。

以下示例使用 CommandBuffer 接口SetRenderTargetAPI 在渲染过程中将渲染目标设置为活动颜色缓冲区,然后使用对象的表面法线作为颜色绘制对象。

using UnityEngine;
using UnityEngine.Rendering.RenderGraphModule;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;

public class DrawNormalsToActiveColorTexture : ScriptableRendererFeature
{

    DrawNormalsPass unsafePass;

    public override void Create()
    {
        unsafePass = new DrawNormalsPass();
        unsafePass.renderPassEvent = RenderPassEvent.AfterRenderingPostProcessing;
    }

    public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
    {
        renderer.EnqueuePass(unsafePass);
    }

    class DrawNormalsPass : ScriptableRenderPass
    {
        private class PassData
        {
            internal TextureHandle activeColorBuffer;
            internal TextureHandle cameraNormalsTexture;
        }

        public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameContext)
        {
            using (var builder = renderGraph.AddUnsafePass<PassData>("Draw normals", out var passData))
            {
                // Make sure URP generates the normals texture
                ConfigureInput(ScriptableRenderPassInput.Normal);

                // Get the frame data
                UniversalResourceData resourceData = frameContext.Get<UniversalResourceData>();

                // Add the active color buffer to our pass data, and set it as writeable 
                passData.activeColorBuffer = resourceData.activeColorTexture;
                builder.UseTexture(passData.activeColorBuffer, AccessFlags.Write);                

                // Add the camera normals texture to our pass data 
                passData.cameraNormalsTexture = resourceData.cameraNormalsTexture;
                builder.UseTexture(passData.cameraNormalsTexture);

                builder.AllowPassCulling(false);

                builder.SetRenderFunc((PassData data, UnsafeGraphContext context) => ExecutePass(data, context));
            }
        }

        static void ExecutePass(PassData passData, UnsafeGraphContext context)
        {
            // Create a command buffer for a list of rendering methods
            CommandBuffer unsafeCommandBuffer = CommandBufferHelpers.GetNativeCommandBuffer(context.cmd);

            // Add a command to set the render target to the active color buffer so URP draws to it
            context.cmd.SetRenderTarget(passData.activeColorBuffer);

            // Add a command to copy the camera normals texture to the render target
            Blitter.BlitTexture(unsafeCommandBuffer, passData.cameraNormalsTexture, new Vector4(1, 1, 0, 0), 0, false);
        }

    }

}

对于另一个示例,请参阅通用渲染管线(URP)包示例中名为 UnsafePass 的示例。

优化渲染图
URP的渲染图表查看器窗口参考