LoginSignup
15
15

More than 5 years have passed since last update.

【Unity】CommandBufferで画面にポストエフェクトをかける

Posted at

はじめに

CommandBufferの理解を深めるため、CommandBufferを使って画面にポストエフェクトをかけるだけのシンプルなものを作ってみました。

環境

Windows 10
Unity5.6.1f1

作ったものについて

シーンを再生すると画面の色が反転するだけのシンプルなものを作りました。

C# スクリプト

コマンドバッファで画面にポストエフェクトをかけるスクリプトです

TestCommandBuffer.cs
using UnityEngine;
using UnityEngine.Rendering;

public class TestCommandBuffer : MonoBehaviour
{
    [SerializeField] Shader shader; // ポストエフェクト用のShader

    void Start()
    {
        if (shader == null) { return; }

        var cam = Camera.main;
        if (cam == null) { return; }

        var mat = new Material(this.shader); // Shaderからマテリアルを作成する
        var buf = new CommandBuffer();

        // 適当な名前のTemporaryRTを作成
        int temp = Shader.PropertyToID("_Temp");
        buf.GetTemporaryRT(temp, -1, -1, 0, FilterMode.Bilinear);

        // ポストエフェクトをかける
        buf.Blit(BuiltinRenderTextureType.CurrentActive, temp);
        buf.Blit(temp, BuiltinRenderTextureType.CurrentActive, mat);

        // TemporaryRTを解放
        buf.ReleaseTemporaryRT(temp);

        // カメラへCommandBufferを追加
        cam.AddCommandBuffer(CameraEvent.AfterEverything, buf);
    }
}

イメージエフェクト用のシェーダー

色を反転させるポストエフェクト用シェーダーです。

Shader "Hidden/NewImageEffectShader"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
    }
    SubShader
    {
        Cull Off ZWrite Off ZTest Always

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);

                // プラットフォームによってはUVの上下が逆になるので補正をいれる
                #if UNITY_UV_STARTS_AT_TOP 
                o.uv = float2(v.uv.x, 1.0 - v.uv.y); 
                #else
                o.uv = v.uv;
                #endif

                return o;
            }

            sampler2D _MainTex;

            fixed4 frag (v2f i) : SV_Target
            {
                fixed4 col = tex2D(_MainTex, i.uv);
                return 1 - col; // 色を反転させる
            }
            ENDCG
        }
    }
}

使う

シーンの適当なオブジェクトにTestCommandBuffer.csをアタッチして、シェーダーを
割り当てます。

image.png

シーンを再生すると画面の色が反転します。 (完)

参考URL

Unity 5 の CommandBuffer を利用したレンダリングパイプラインの拡張について調べてみた
http://tips.hecomi.com/entry/2016/02/19/090000

15
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
15