🐡

UnityでShader始めてみた No.1 シェーダープログラム

2022/11/16に公開

普段Unityでゲームを制作している大学生のmarmelonです。
ずっと前からシェーダーが気になっていたので、この機会に勉強してみることにしました。

記事にする目的

Zennを用いて記事にする理由は、
「シェーダーを学びたいけど何から学べば良いか分からない」
と思っている人に参考にしてほしいからです。

初心者でも勉強続ければそれなりにできるようになるんだぞ!ってところを見せることができればいいかな、と思います。

シェーダープログラム

シェーダープログラムのサンプルを使って説明してみようと思います。

// シェーダーの名前 Unlitフォルダに入れるColorという名前
Shader "Unlit/Color"
{
    SubShader
    {
        Pass
        {
            // どのタグを割り当てるか 透明度の指定等ができる
            Tags { "RenderType" = "Opaque" }

            CGPROGRAM
            #pragma vertex vert         // 頂点シェーダーは vert の名前で記すことの宣言
            #pragma fragment frag       // フラグメントシェーダーは frag の名前で記すことの宣言
            #include "UnityCG.cginc"

            // セマンティクス(GPUに入力や出力の値が何の意味を持つか教えるためのもの)
            // 頂点シェーダーにくるデータをまとめる構造体
            struct appdata
            {
                float4 vertex : POSITION;   // 頂点の座標
                fixed3 color : COLOR0;      // 頂点カラー
            };

            // フラグメントシェーダーに送るデータをまとめる構造体
            struct v2f
            {
                float4 vertex : SV_POSITION;    // 頂点の座標
                fixed3 color : COLOR0;          // 頂点カラー
            };

            // 頂点シェーダー
            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.color = v.color;
                return o;
            }

            // フラグメントシェーダー
            fixed4 frag (v2f i) : SV_Target
            {
                return fixed4(i.color, 1);
            }
            ENDCG
        }
    }
}

セマンティクス

シェーダープログラムの入出力の値の意味を表すもの。
appdataは頂点座標にくるデータ(頂点の座標と色)を、
v2fはフラグメントシェーダーに送るデータ(変換後の頂点座標と色)をまとめている。

文法上必要?らしい

頂点シェーダー

3Dオブジェクトの頂点を処理してくれる。
三角形なら3回、四角形なら4回、頂点の回数だけ実行される。
3Dのオブジェクトを2Dの画面にそのまま映すことはできないので、上手く映せるように座標変換をしてくれる。

プログラムの中身は、頂点座標と色の情報を受け取って、フラグメントシェーダーに渡す型に変換しているだけです。

フラグメントシェーダー

ピクセルの色を処理してくれる。
表示するメッシュのピクセルの数だけ実行されるため、頂点とは比較にならない回数となる。

プログラムの中身は、頂点シェーダーで受け取った情報にアルファ値を加えたfixed4型にしているだけです。


各頂点には赤色、青色、緑色を指定した上で、三角形のメッシュに適用してみました。

間の色は補間されるようです。

参考にしたリンク

【Unite 2017 Tokyo】シェーダープログラミング入門!カスタムシェーダー、作るで!

【Unity】プログラミングで作ったメッシュを頂点カラーで色を塗る方法

Discussion