Version: Unity 6.0 (6000.0)
语言 : 中文
将纹理添加到摄像机历史记录
URP 的帧数据纹理参考

在 URP 中通过帧缓冲区获取来获取当前帧缓冲区

要加快渲染速度,请使用帧缓冲区获取来读取 Unity 到目前为止已渲染的帧。

使用帧缓冲区获取意味着渲染通道可以从 GPU 的片上内存而不是视频内存访问帧缓冲区。这样可以加快渲染速度,因为 GPU 不需要将纹理复制到其视频内存中或从其视频内存中复制纹理。

如果使用以下图形 API 之一,则支持帧缓冲区获取:

  • Vulkan
  • Metal

在使用基于图块的延迟渲染 (TBDR) 的移动设备上,帧缓冲区获取会大大加快渲染速度。在渲染通道之间,GPU 将帧保留在片上图块内存中,从而使用更少的内存带宽和处理时间。

如果使用帧缓冲区获取,URP 会合并写入帧缓冲区和从帧缓冲区读取的渲染通道。您可以在渲染图查看器 (Render Graph Viewer) 窗口中选中此选项。

使用帧缓冲区获取

要在渲染通道中使用帧缓冲区获取,请使用以下各项:

  • 使用 SetInputAttachment API 将上一个渲染通道的输出设置为新渲染通道的输入。
  • 在片元着色器代码中使用 LOAD_FRAMEBUFFER_X_INPUT 宏对上一个渲染通道的输出进行采样,而不是像 SAMPLE_TEXTURE2D 这样的宏。

以下步骤假设您已有一个名为 sourceTextureHandle 的渲染通道,用于写入 TextureHandle

  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 通过帧缓冲区获取对纹理进行采样。例如:

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

    class PassData
    {
        public Material frameBufferFetchMaterial;
    }
    
  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), frameBufferFetchMaterial, 1);
    }
    

示例

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

其他资源

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