版本:Unity 6 (6000.0)
语言:英语
向相机历史记录添加纹理
URP 的帧数据纹理引用

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

为了加快渲染速度,可以使用帧缓冲区获取来读取 Unity 迄今为止渲染的帧。

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

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

  • Vulkan
  • Metal

对于使用基于平铺的延迟渲染 (TBDR) 的移动设备,帧缓冲区获取可以显着提高渲染速度。GPU 在渲染通道之间将其芯片平铺内存中的帧保持在内存中,从而减少内存带宽和处理时间。

如果您使用帧缓冲区获取,URP 会合并写入帧缓冲区并从中读取的渲染通道。您可以在 渲染图查看器窗口 中查看此操作。

使用帧缓冲区获取

要在渲染通道中使用帧缓冲区获取,请使用以下方法

  • SetInputAttachment API 用于将先前渲染通道的输出设置为新渲染通道的输入。
  • 片段 着色器在 GPU 上运行的程序。 更多信息
    请参阅 术语表
    代码中的 LOAD_FRAMEBUFFER_X_INPUT 宏,用于采样先前渲染通道的输出,而不是像 SAMPLE_TEXTURE2D 这样的宏。

以下步骤假设您已经有一个渲染通道,该通道写入名为 sourceTextureHandleTextureHandle

  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 的帧数据纹理引用