うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【Unity】ポストエフェクトを利用する

ポストエフェクトとは

主にシェーダーを用いて、カメラの写している画像を加工し画面に表示させることです

海外の記事では「Image Effect」と記述されることが多いため、海外の記事を探す場合は
「Post Effect」ではなく「Image Effect」で探したほうが記事が見つかるかもしれません

ポストエフェクト利用方法

ポストエフェクトを利用するには Camera がついているオブジェクトに
OnRenderImage のメソッドがあるスクリプトをアタッチすることで利用できます

MonoBehaviour-OnRenderImage(RenderTexture,RenderTexture) - Unity スクリプトリファレンス

OnRenderImage 内 で Graphics.Blit を利用してマテリアルを介してのテクスチャコピーを行うことで
カメラが写している画像を加工して表示することができます

汎用的なポストエフェクトのコード

using UnityEngine;
 
[RequireComponent(typeof(Camera))]
[ExecuteInEditMode]
public class PostEffect : MonoBehaviour
{
    [SerializeField]
    [HideInInspector]
    private Camera _camera;
    
    [SerializeField]
    private Material _material;
    
#if UNITY_EDITOR
 
    private void Reset()
    {
        _camera = GetComponent<Camera>();
    }
 
#endif
    
    private void OnRenderImage(RenderTexture source, RenderTexture destination)
    {
        if (_material == null)
        {
            Graphics.Blit(source, destination);
            return;
        }
        
        Graphics.Blit(source, destination, _material);
    }
}

動作確認

以前投稿したHSV変換のシェーダーを利用してみます
画像のHSV変換シェーダー - うにてぃブログ

マテリアルの変更に応じて画面の表示を変えることができました

f:id:hacchi_man:20200318001048g:plain

※ 画面全体の描画になるため、解像度が高いほど高負荷になるので利用には注意が必要です