読者です 読者をやめる 読者になる 読者になる

【Unityで始める初めてのShader】ポストエフェクトの作り方2

shader2_2

前回の続きです。足りない情報は将来の自分が書き足してくれると思います。
PostEffect.shaderをいじっていきますよ。

まずはこんな感じにざっくりとコードを消して下さい。

Shader Custom/PostEffect {
    Properties {
        
    }
    SubShader {
        
    } 
    FallBack Diffuse;
}

このうちPropertiesはシェーダ内で使う変数とUnityエディタを関連付けるものです。ここで定義した変数はシェーダ内で使用することもできるし、Unityエディタで直接値を変えることもできるというわけです。
SubShderは実際に処理を書いていくところ。
FallBackはSubShader内で使用する関数等が実行するハードウェアで使用できないとき、かわりにこのシェーダを適用してね、と指示するところです。
このうち、PropertiesとFallBackは省略できるので省略してみます。

Shader "Custom/PostEffect" {
    SubShader {
        
    }
}

少しは簡単に見えるようになりましたね。
ここで少しおまじないを追加します。

Shader "Custom/PostEffect" {
    SubShader {
        Pass {
            CGPROGRAM

            ENDCG
        }
    }
}

おまじないの意味は省きますね(正直、自分も説明できるほどわかっていない)

さて、今回はポストエフェクトを作りたい。それも処理の簡単な色だけを変化させるものにしたい。
ということで、フラグメントシェーダ関数というものを使っていきます。
まずフラグメントシェーダを使うために次の一行を追加します。

#pragma fragment frag

これは今からフラグメントシェーダを使用しますよ~という宣言。続いて、そのフラグメントシェーダはfragという関数名ですよ、という意味です。
では、この宣言と関数を追加しましょう。

Shader "Custom/PostEffect" {
    SubShader {
        Pass {
            CGPROGRAM

            #pragma fragment frag

            fixed4 frag() : COLOR {
                return fixed4(1.0,0.0,0.0,1.0);
            }

            ENDCG
        }
    }
}

fragmentで指定されたfragがreturnする結果がシェーダに反映されるわけです。 この状態で実行すると... shader2_1

黒ではなくなりましたが、テクスチャなどの適用を間違えた時に発生するピンクになりました。これは頂点が指定されていないためです。
頂点を指定するには頂点シェーダ関数を使います。フラグメントシェーダと同様にまずは宣言をします。

#pragma vertex vert_img

頂点シェーダは頂点を操作するものですが、今回はその必要もないし標準のライブラリの関数を指定します。そのために次の一行を追加。

#include "UnityCG.cginc"

このUnityCG.cgincの中にvert_img関数が入っていて、その関数を頂点シェーダとして使用します、という意味です。

というわけで今回の完成形

Shader "Custom/PostEffect" {
    SubShader {
        Pass {
            CGPROGRAM

            #include "UnityCG.cginc"

            #pragma vertex vert_img
            #pragma fragment frag

            fixed4 frag() : COLOR {
                return fixed4(1.0,0.0,0.0,1.0);
            }

            ENDCG
        }
    }
}

実行結果 shader2_2

無事、returnで返した値が反映されましたね!