包含此页的版本:
不含此页的版本:
要更有效地读取 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.以下步骤假设你已经有一个渲染通道,该渲染通道将写入TextureHandle叫sourceTextureHandle.
创建自定义着色器,然后从着色器创建材质。有关创建自定义着色器的详细信息,请参阅编写自定义着色器。
在自定义着色器的 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从片上 GPU 内存中对纹理进行采样。例如:
half4 frag() : SV_Target
{
half4 colorFromPreviousRenderPass = LOAD_FRAMEBUFFER_X_INPUT(0, input.positionCS.xy);
return colorFromPreviousRenderPass;
}
在新的渲染图表渲染通道中,将你创建的材质添加到PassData.例如:
class PassData
{
public Material exampleMaterial;
}
用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), exampleMaterial, 1);
}
有关完整示例,请参阅渲染图系统URP包示例中名为 FrameBufferFetch 的示例。