Version: 6000.3
语言: 中文
将纹理添加到相机历史记录中
URP 的帧数据纹理参考

在 URP 中从 GPU 内存中获取当前帧缓冲区

要更有效地读取 Unity 在上一个通道中渲染的帧,请使用SetInputAttachmentAPI 将渲染通道的输出设置为下一个渲染通道的输入。

SetInputAttachment表示渲染通道可以从 GPU 的片上内存(而不是视频内存)访问帧缓冲区。这加快了渲染速度,因为GPU不需要将纹理复制到其视频内存或从其视频内存复制纹理。此过程有时称为帧缓冲区获取。

在移动设备上,使用基于图块的延迟渲染 (TBDR) 的移动设备的渲染速度会提高。GPU 在渲染传递之间将帧保留在其片上图块内存中,使用更少的内存带宽和处理时间。

如果您使用SetInputAttachmentAPI,URP 合并写入帧缓冲区并从中读取的渲染通道。你可以在 渲染图表查看器(Render Graph Viewer) 窗口中检查这一点。

您还可以使用SetInputAttachment读取其他渲染目标,例如 G 缓冲区。

要求

SetInputAttachment如果使用以下图形 API 之一,则支持 API:

  • 火神
  • 金属

如果您使用SetInputAttachment使用不受支持的 API 时,Unity 会将纹理复制到视频内存或从视频内存复制纹理,因此对渲染速度没有影响。

使用SetInputAttachment应用程序接口

要使用SetInputAttachmentAPI 中,请使用以下命令:

  • SetInputAttachmentAPI 将上一个渲染通道的输出设置为新渲染通道的输入。
  • LOAD_FRAMEBUFFER_X_INPUT片段中的宏着色器在 GPU 上运行的程序。更多信息
    请参阅术语表
    代码读取像素计算机图像中的最小单位。像素大小取决于您的屏幕分辨率。像素光照是在每个屏幕像素下计算的。更多信息
    请参阅术语表
    ,而不是采样宏,例如SAMPLE_TEXTURE2D.

以下步骤假设你已经有一个渲染通道,该渲染通道将写入TextureHandlesourceTextureHandle.

  1. 创建自定义着色器,然后从着色器创建材质。有关创建自定义着色器的详细信息,请参阅编写自定义着色器

  2. 在自定义着色器的 HLSLPROGRAM 中,确保导入Packages/com.unity.render-pipelines.core/Runtime/Utilities/Blit.hlsl文件:

    HLSLPROGRAM
    ...
    #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
    ...
    ENDHLSL
    
  3. 在 HLSLPROGRAM 中,使用以下命令之一声明上一个呈现传递中的纹理。例如:

    • FRAMEBUFFER_INPUT_X_HALF
    • FRAMEBUFFER_INPUT_X_FLOAT
    • FRAMEBUFFER_INPUT_X_INT
    • FRAMEBUFFER_INPUT_X_UINT

    例如:

    FRAMEBUFFER_INPUT_X_HALF(0);
    
  4. 在片段函数中,使用LOAD_FRAMEBUFFER_X_INPUT从片上 GPU 内存中对纹理进行采样。例如:

    half4 frag() : SV_Target
    {
        half4 colorFromPreviousRenderPass = LOAD_FRAMEBUFFER_X_INPUT(0, input.positionCS.xy);
        return colorFromPreviousRenderPass;
    }
    
  5. 在新的渲染图表渲染通道中,将你创建的材质添加到PassData.例如:

    class PassData
    {
        public Material exampleMaterial;
    }
    
  6. builder.SetInputAttachment将上一个渲染通道的输出设置为新渲染通道的输入。例如:

    builder.SetInputAttachment(sourceTextureHandle, 0, AccessFlags.Read);
    
  7. 在您的SetRenderFunc方法,请使用命令,例如BlitTexture以使用材质进行渲染。例如:

    static void ExecutePass(PassData data, RasterGraphContext context)
    {
        Blitter.BlitTexture(context.cmd, new Vector4(1, 1, 0, 0), exampleMaterial, 1);
    }
    

有关完整示例,请参阅渲染图系统URP包示例中名为 FrameBufferFetch 的示例。

其他资源

将纹理添加到相机历史记录中
URP 的帧数据纹理参考