【Unity】レンダーテクスチャを使って画面にガウスぼかしをかける

投稿者: | 2024-01-26

カスタムパスでレンダーテクスチャを使って、簡単に画面にガウシアンぼかしをかけてみました。

参考:https://github.com/alelievr/HDRP-Custom-Passes#slight-blur-effect

カスタムパスを作成

Projectウィンドウで「HDRP C# Custom Pass」を新規作成します。

シーンにCustom Pass Volumeコンポーネントを追加し、Custom Passesの「+」ボタンを押します。

一覧に新規作成したカスタムパスが表示されるので、選択して追加します。

カスタムパスでは、デフォルトでターゲットバッファやクリアフラッグなどを指定できます。

CustomPassクラスに定義されていて、アクセスできます。

ガウスぼかしを描画

新規カスタムパスのスクリプトを編集します。

using UnityEngine;
using UnityEngine.Rendering.HighDefinition;
using UnityEngine.Rendering;
using UnityEngine.Experimental.Rendering;

class TestBlur : CustomPass
{
    RTHandle blurBuffer;
    [SerializeField] float radius;

    protected override void Setup(ScriptableRenderContext renderContext, CommandBuffer cmd)
    {
        // RTHandleを割り当て
        blurBuffer = RTHandles.Alloc(
                    Vector2.one * 0.5f, TextureXR.slices, dimension: TextureXR.dimension,
                    colorFormat: GraphicsFormat.B10G11R11_UFloatPack32, 
                    useDynamicScale: true, name: "BlurBuffer");

    }

    protected override void Execute(CustomPassContext ctx)
    {
        if (radius > 0)
        {
            // ターゲットバッファを選択
            var targetBuffer = (targetColorBuffer == TargetBuffer.Camera) ? ctx.cameraColorBuffer : ctx.customColorBuffer.Value;
            
            // ガウスぼかし描画
            CustomPassUtils.GaussianBlur(ctx, ctx.cameraColorBuffer, targetBuffer, blurBuffer, radius: radius);
        }
    }

    protected override void Cleanup()
    {
        // RTHandleを解放
        blurBuffer.Release();
    }
}

SetUpメソッドで、RTHandles.Alloc関数を使ってレンダーテクスチャを管理するRTHandleを割り当てます。アルファのないフォーマットを指定しています。

    RTHandle blurBuffer;
    [SerializeField] float radius;

    protected override void Setup(ScriptableRenderContext renderContext, CommandBuffer cmd)
    {
        // RTHandleを割り当て
        blurBuffer = RTHandles.Alloc(
                    Vector2.one * 0.5f, TextureXR.slices, dimension: TextureXR.dimension,
                    colorFormat: GraphicsFormat.B10G11R11_UFloatPack32, 
                    useDynamicScale: true, name: "BlurBuffer");

    }

Executeメソッドで、CustomPassUtils.GaussianBlurメソッドを使ってガウスぼかしを描画します。

    protected override void Execute(CustomPassContext ctx)
    {
        if (radius > 0)
        {
            // ターゲットバッファを選択
            var targetBuffer = (targetColorBuffer == TargetBuffer.Camera) ? ctx.cameraColorBuffer : ctx.customColorBuffer.Value;
            
            // ガウスぼかし描画
            CustomPassUtils.GaussianBlur(ctx, ctx.cameraColorBuffer, targetBuffer, blurBuffer, radius: radius);
        }
    }

CustomPassUtils.GaussianBlurメソッドの引数には、ソースと出力、内部的に使用する一時的なレンダーターゲットの3つのRTHandleを渡します。一時的なレンダーターゲットとして、SetUpメソッドで割り当てたRTHandleを渡しています。

引数のsampleCountの既定値が9になっています。数値を上げると結果がきれいになりますが、パフォーマンスに影響します。

radiusが0以下のときはエフェクトがかからないようにしています。基底クラスのtargetColorBuffer変数の値によって、ターゲットバッファを切り替えています。

最後にCleanupメソッドで、Releaseメソッドを使ってRTHandleを解放しています。

    protected override void Cleanup()
    {
        // RTHandleを解放
        blurBuffer.Release();
    }
}
参考:https://github.com/alelievr/HDRP-Custom-Passes#slight-blur-effect

コメントを残す

メールアドレスが公開されることはありません。