【Unity-Shader】#02 不透明なテクスチャを表示する

不透明な画像=テクスチャを表示するシェーダーを作成します。 f:id:snoopopo:20200825132847p:plain

全文

Shader "Custom/Texture"
{
    Properties
    {
        _MainTex("Texture", 2D) = "white" {}
    }

    SubShader
    {
        Pass
        {
            CGPROGRAM

            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD;   //テクスチャ座標
            };

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

            sampler2D _MainTex;

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

            fixed4 frag(v2f i) : SV_Target
            {
                fixed4 color = tex2D(_MainTex, i.uv);
                return color;
            }

            ENDCG
        }
    }
}

Properties

properties に設定するとマテリアルのインスペクタから値を設定することができる。

   Properties
    {
        _MainTex("Texture", 2D) = "white" {}
    }

_MainTex はシェーダー内の変数 sampler2D _MainTex を表していて、マテリアルで設定した値はこの変数に入ることを表す。

   SubShader
    {
        Pass
        {
            CGPROGRAM

            sampler2D _MainTex;

            ENDCG
        }
    }


"Textue" →マテリアルのインスペクタ に表示する名称。
2D →2D型 であることを表す。テクスチャを設定したい場合には2D型を使う。
"white" →テクスチャが設定されていないときのデフォルト色。

sampler2D 型

テクスチャの参照そのものが代入される型。 後術するtex2Dメソッドとセットで使われる。

頂点シェーダ

           struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD;   //テクスチャ座標
            };

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

            sampler2D _MainTex;

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

UV座標

ポリゴンの各頂点にはテクスチャの座標情報が含まれている。
テクスチャの座標情報とは、張り付けられるテクスチャのどの画素がその頂点の位置に対応するかを表す情報。
これをUV座標といい、左下が(0,0)で、右上が(1,1)で表される。真ん中は(0.5,0.5) になるという意味。

この情報は、頂点が持っている情報であるため、 まずはレンダリングパイプラインから頂点シェーダにUV座標をもらい、それをフラグメントシェーダに連携する。 その後、フラグメントシェーダで、UV座標を元に画像からその画素に対する色を取得する。

セマンティクス TEXCOORD

UV座標を表す。

フラグメントシェーダ

上述した通り、インプットのv2fにはUV座標が定義されており、頂点シェーダで設定したものが入っている。

これを使い、この画素に対するテクスチャを取得する。

           fixed4 frag(v2f i) : SV_Target
            {
                fixed4 color = tex2D(_MainTex, i.uv);
                return color;
            }

tex2D

指定されたUV座標の画素の色を返す関数。