ユニティちゃんでShader学習①、単色シェーダー

ユニティちゃんでShader学習①、単色シェーダー

ユニティちゃんで学習。最もシンプルなUnity 3D用シェーダーの作り方。
単色を返すシェーダー。

関連ページ 参考URL
自分はuGUI用シェーダーばかり作っていて、いい加減3Dシェーダーも勉強しなくちゃいけないと思っていました。
その勉強メモと解説になります。

事前にこちらの uGUI用シェーダーの記事 を読むと、よりこのページのことも理解しやすいかもしれません。

テストに使う3Dモデル

最終的にはトゥーンシェーダーの勉強に繋げたいので、公式提供のユニティちゃんを使って実装しています。
こちらの ユニティちゃんPackege UnityToonShader を使っていきます。
Unityちゃんパッケージ

単色を返す3Dシェーダー

全く実用的ではないですが、最もシンプルなシェーダーは単一色を返すシェーダーになります。
Shader "Unlit/SingleColor"
{
    
//マテリアルプロパティを追加

    Properties
    {
        _Color ("Main Color", Color) = (1,1,1,1)
    }

    SubShader
    {
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            
            struct appdata
            {
                float4 vertex : POSITION;
            };

            struct v2f
            {
                float4 vertex : SV_POSITION;
            };

            
//プロパティに対応するシェーダー変数を追加

            fixed4 _Color;

            
// 頂点シェーダー

            v2f vert (appdata v)
            {
                v2f o;
                
// ワールド座標をカメラを原点とする座標系に変換し、

                
// かつカメラの画角外の頂点を削ります

                o.vertex = UnityObjectToClipPos(v.vertex);
                return o;
            }

            
// ピクセルシェーダー

            fixed4 frag (v2f i) : SV_Target
            {
                return _Color;
            }
            ENDCG
        }
    }
}
最後のピクセルシェーダー(フラグメントシェーダー)で返してる値が実際に画面に反映される色です。
                return fixed4(1, 1, 1, 1);

試しにユニティちゃんの服のマテリアルであるdef_matのシェーダーを、さきほど作ったUnlit/SingleColorに変えてみます。
Unityちゃんの服のシェーダーの設定
Unityちゃんの服のシェーダーを変更

結果は下の通りです。
単一色シェーダーに変えたUnityちゃん

例えば最後に返す色を白(1, 1, 1, 1)から赤(1, 0, 0, 1)に変えてみると、勿論ユニティちゃんの服の色も変わります。
                return fixed4(1, 0, 0, 1);
赤色に変えたUnityちゃん

プロパティで外部から色を指定

マテリアルプロパティ を追加すると、いちいちコードを書き換えなくても外部から色を指定できます。
Shader "Unlit/SingleColor"
{
    
//マテリアルプロパティを追加

    Properties
    {
        _Color ("Main Color", Color) = (1,1,1,1)
    }

    SubShader
    {
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            
            struct appdata
            {
                float4 vertex : POSITION;
            };

            struct v2f
            {
                float4 vertex : SV_POSITION;
            };

            
//プロパティに対応するシェーダー変数を追加

            fixed4 _Color;

            
// 頂点シェーダー

            v2f vert (appdata v)
            {
                v2f o;
                
// ワールド座標をカメラを原点とする座標系に変換し、

                
// かつカメラの画角外の頂点を削ります

                o.vertex = UnityObjectToClipPos(v.vertex);
                return o;
            }

            
// ピクセルシェーダー

            fixed4 frag (v2f i) : SV_Target
            {
                return _Color;
            }
            ENDCG
        }
    }
}

最初の方にプロパティのコードが追加されています。
    
//マテリアルプロパティを追加

    Properties
    {
        _Color ("Main Color", Color) = (1,1,1,1)
    }
途中辺りにプロパティに対応するシェーダー変数が定義されています。
            
//プロパティに対応するシェーダー変数を追加

            fixed4 _Color;

マテリアルのインスペクターを見ると、Main Coorという表示が追加されています。
色変化のプロパティ

今回はここまで、次のページでは 座標を色に変換するシェーダー を作っています。
0
0