Custom Pass Utils API ユーザーマニュアル
ブラー
ガウシアンブラー
ガウシアンブラー機能を使うと、任意の半径と品質 (サンプル数) を持つ画像をぼかすことができます。パフォーマンスの理由により、ブラーカーネルはダウンサンプルパスの後に実行できます。これによりブラー効果のリソース負荷は減少しますが、品質も低下します。
こちらはカメラのカラーバッファをぼかすカスタムパスの一例です。
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,
// アルファはガウシアンブラーに不要なため、このエフェクトはアルファチャンネルを持たない 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 が提供するカスタムパスバッファも利用できます。たとえ半解像度バッファでなくても、アルゴリズムはテクスチャの半分のみを使います。