【Unity-Shader】#01 オブジェクトを単色で塗りつぶす

フラグメントシェーダーを使ってオブジェクトを単色で塗りつぶします。

f:id:snoopopo:20200824102131p:plain

全文

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

            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
            };

            struct v2f
            {
                float4 vertex : SV_POSITION;
            };

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

            fixed4 frag(v2f i) : SV_Target
            {
                return fixed4(1, 0, 0, 1);
            }

            ENDCG
        }
    }
}

頂点シェーダ

おさらい:頂点シェーダーは頂点の数分よばれる。

           struct appdata
            {
                float4 vertex : POSITION;
            };

            struct v2f
            {
                float4 vertex : SV_POSITION;
            };

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

UnityObjectToClipPos

引数で受け取った頂点の座標=3D座標 をビュー座標(画面に映る座標)に変換してくれる便利関数。

インクロードしている UnityCG.cginc に定義されている。

セマンティクス POSITION、SV_POSITION

セマンティクスとは この値がどういう意味を表すのかを定義したもの。
この定義をみてレンダリングパイプラインもこの値がなんなのか判断できる。

ここで出てきているPOSITIONSV_POSITIONはどちらも座標位置を表す。
頂点シェーダの出力であるレンダリングパイプラインに渡す座標は、SV_POSITION として、POSITIONと区別するために利用されているっぽい。

フラグメントシェーダー

おさらい:フラグメントシェーダは画素数分よばれる。

           fixed4 frag(v2f i) : SV_Target
            {
                return fixed4(1, 0, 0, 1);
            }

今回は赤く塗りつぶすだけなので、引数でつかった値を使わず、そのままその画素の色として (1,0,0,1)=赤 を返している。

fixed4 型

4つの固定小数点で構成される型。よく色を表すのに使ったりする。