要加快渲染速度,请使用帧缓冲区获取来读取 Unity 到目前为止已渲染的帧。
使用帧缓冲区获取意味着渲染通道可以从 GPU 的片上内存而不是视频内存访问帧缓冲区。这样可以加快渲染速度,因为 GPU 不需要将纹理复制到其视频内存中或从其视频内存中复制纹理。
如果使用以下图形 API 之一,则支持帧缓冲区获取:
在使用基于图块的延迟渲染 (TBDR) 的移动设备上,帧缓冲区获取会大大加快渲染速度。在渲染通道之间,GPU 将帧保留在片上图块内存中,从而使用更少的内存带宽和处理时间。
如果使用帧缓冲区获取,URP 会合并写入帧缓冲区和从帧缓冲区读取的渲染通道。您可以在渲染图查看器 (Render Graph Viewer) 窗口中选中此选项。
要在渲染通道中使用帧缓冲区获取,请使用以下各项:
SetInputAttachment API 将上一个渲染通道的输出设置为新渲染通道的输入。LOAD_FRAMEBUFFER_X_INPUT 宏对上一个渲染通道的输出进行采样,而不是像 SAMPLE_TEXTURE2D 这样的宏。以下步骤假设您已有一个名为 sourceTextureHandle 的渲染通道,用于写入 TextureHandle。
创建自定义着色器,然后从着色器创建材质。有关创建自定义着色器的更多信息,请参阅编写自定义着色器。
在自定义着色器的 HLSLPROGRAM 中,确保导入 Packages/com.unity.render-pipelines.core/Runtime/Utilities/Blit.hlsl 文件:
HLSLPROGRAM
...
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
...
ENDHLSL
在 HLSLPROGRAM 中,使用以下项之一声明来自上一个渲染通道中的纹理。例如:
FRAMEBUFFER_INPUT_X_HALFFRAMEBUFFER_INPUT_X_FLOATFRAMEBUFFER_INPUT_X_INTFRAMEBUFFER_INPUT_X_UINT例如:
FRAMEBUFFER_INPUT_X_HALF(0);
在片元函数中,使用 LOAD_FRAMEBUFFER_X_INPUT 通过帧缓冲区获取对纹理进行采样。例如:
half4 frag() : SV_Target
{
half4 colorFromPreviousRenderPass = LOAD_FRAMEBUFFER_X_INPUT(0, input.positionCS.xy);
return colorFromPreviousRenderPass;
}
在新的渲染图渲染通道中,将创建的材质添加到 PassData 中。例如:
class PassData
{
public Material frameBufferFetchMaterial;
}
使用 builder.SetInputAttachment 将上一个渲染通道的输出设置为新渲染通道的输入。例如:
builder.SetInputAttachment(sourceTextureHandle, 0, AccessFlags.Read);
在 SetRenderFunc 方法中,使用 BlitTexture 等命令使用材质进行渲染。例如:
static void ExecutePass(PassData data, RasterGraphContext context)
{
Blitter.BlitTexture(context.cmd, new Vector4(1, 1, 0, 0), frameBufferFetchMaterial, 1);
}
有关完整示例,请参阅渲染图系统 URP 包示例中名为 FrameBufferFetch 的示例。