自定义通道 Utils API 用户手册
模糊
高斯模糊 (Gaussian Blur)
高斯模糊函数可用于对具有任意半径和质量(样本数量)的图像进行模糊处理。出于性能原因,可以在下采样通道之后运行模糊内核。这样可以降低模糊效果的资源消耗量,但同时也会降低质量。
以下是对摄像机颜色缓冲区进行模糊处理的自定义通道示例:
using UnityEngine;
using UnityEngine.Rendering.HighDefinition;
using UnityEngine.Rendering;
using UnityEngine.Experimental.Rendering;
class GaussianBlur : CustomPass
{
RTHandle halfResTarget;
protected override void Setup(ScriptableRenderContext renderContext, CommandBuffer cmd)
{
halfResTarget = RTHandles.Alloc(
// 注意此处的 * 0.5f。这将分配一个半分辨率目标,从而节省大量内存。
Vector2.one * 0.5f, TextureXR.slices, dimension: TextureXR.dimension,
// 由于高斯模糊不需要使用 Alpha,所以此效果使用没有 Alpha 通道的 HDR 纹理格式。
colorFormat: GraphicsFormat.B10G11R11_UFloatPack32,
// 创建纹理时,请务必指定有意义的名称,因为这对于调试很有用。
useDynamicScale: true, name: "Half Res Custom Pass"
);
}
protected override void Execute(CustomPassContext ctx)
{
// 指定模糊的半径(以像素为单位)。此示例使用 8 像素半径。
float radius = 8.0f;
// 指定模糊的精度。这也会影响蓝色的资源消耗量。值 9 很适合实时应用程序。
int sampleCount = 9;
// 如果有多个不同分辨率的摄像机,这会使这些摄像机之间的模糊效果保持一致。
radius *= ctx.cameraColorBuffer.rtHandleProperties.rtHandleScale.x;
// 实际的高斯模糊调用。它将当前摄像机的颜色缓冲区指定为源和目标。
// 这会将半分辨率目标用作模糊通道之间的临时渲染目标。
// 请注意,高斯模糊函数会在完成时清除半分辨率缓冲区的内容。
CustomPassUtils.GaussianBlur(
ctx, ctx.cameraColorBuffer, ctx.cameraColorBuffer, halfResTarget,
sampleCount, radius, downSample: true
);
}
// 释放分配给半分辨率目标的 GPU 内存。这很重要,否则内存会泄漏。
protected override void Cleanup() => halfResTarget.Release();
}
请注意,此示例使用了半分辨率目标 (halfResTarget),因为此示例先处理下采样通道。不过,也可以使用 HDRP 提供的自定义通道缓冲区。即使这不是半分辨率缓冲区,算法也仅使用一半的纹理。