为了加快渲染速度,可以使用帧缓冲区获取来读取 Unity 迄今为止渲染的帧。
使用帧缓冲区获取意味着渲染通道可以访问 GPU 芯片内存中的帧缓冲区,而不是视频内存。这加快了渲染速度,因为 GPU 不需要将纹理复制到视频内存中并从视频内存中复制出来。
如果您使用以下图形 API 之一,则支持帧缓冲区获取
对于使用基于平铺的延迟渲染 (TBDR) 的移动设备,帧缓冲区获取可以显着提高渲染速度。GPU 在渲染通道之间将其芯片平铺内存中的帧保持在内存中,从而减少内存带宽和处理时间。
如果您使用帧缓冲区获取,URP 会合并写入帧缓冲区并从中读取的渲染通道。您可以在 渲染图查看器窗口 中查看此操作。
要在渲染通道中使用帧缓冲区获取,请使用以下方法
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_HALF
FRAMEBUFFER_INPUT_X_FLOAT
FRAMEBUFFER_INPUT_X_INT
FRAMEBUFFER_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 的示例。