夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

ゼロから始めるUnityShader開発 第五章 独自シェーダーを書く 色を変える

本日は昨日に引き続きShader枠です。

昨日に引き続き先日筆者の所属している会社で行ったShader勉強会の内容をまとめていきます。

redhologerbera.hatenablog.com

redhologerbera.hatenablog.com

〇独自シェーダーを書く 色を変える

ここからは実際に手を動かしながら学んでいきます。

前回まで解説していたUnityのUnlitシェーダーではテクスチャを貼り付けて色を付けることができます。

まずは色を変えていきましょう。

色はフラグメントシェーダーで4次元の値として記述されています。

            fixed4 frag (v2f i) : SV_Target
            {
                // sample the texture
                fixed4 col = tex2D(_MainTex, i.uv);
                // apply fog
                UNITY_APPLY_FOG(i.fogCoord, col);
                return col;
            }

ここではcolにテクスチャを貼り付けて出力しています。

つまりcolが色情報になっています。 次のように書き換えてみます。

            fixed4 frag (v2f i) : SV_Target
            {
                // sample the texture
                fixed4 col = fixed4(1,0,0,1); //変更
                // apply fog
                UNITY_APPLY_FOG(i.fogCoord, col);
                return col;
            }

赤色が出力されます。

第二成分(y)を1へ変更することで緑が出力されます。

            fixed4 frag (v2f i) : SV_Target
            {
                // sample the texture
                fixed4 col = fixed4(0,1,0,1); //tex2D(_MainTex, i.uv);
                // apply fog
                UNITY_APPLY_FOG(i.fogCoord, col);
                return col;
            }

第三成分(z)を1へ変更することで青が出力されます。

            fixed4 frag (v2f i) : SV_Target
            {
                // sample the texture
                fixed4 col = fixed4(0,0,1,1); //tex2D(_MainTex, i.uv);
                // apply fog
                UNITY_APPLY_FOG(i.fogCoord, col);
                return col;
            }

〇マテリアル側で色を変えれるようにする

さて、上記の例ではコード内に直接数値を入れて変化を学びました。

ここからはUnityのマテリアルのパラメータとして色を調整できるようにしていきます。

マテリアルのパラメータとして表に出すためにはShaderLabのPropertiesブロックに変数を定義します。

色の場合はcolorを定義します。

    Properties
    {
       // _MainTex ("Texture", 2D) = "white" {}  今は使わないのでいったんコメントアウト
        _MainColor("Color" ,color) = (1,1,1,1)
    }

これによってマテリアル側にColorが表示されます。

このColorパラメータはマテリアル側でクリックすることでカラーパレットが表示されます。

この変数をHLSL内で使用するためにHLSL文の中に変数を定義します。

この際にPropertiesブロックで定義した変数と同じ変数を定義する必要があります。

   struct appdata
            {
     ・・・
            };

            struct v2f
            {
     ・・・              
            };
            float4 _MainColor;//追加
            v2f vert (appdata v)
            {
     ・・・
            }

            fixed4 frag (v2f i) : SV_Target
            {
               ・・・
               return col;
            }

定義した変数をフラグメントシェーダー内で出力であるcolへ代入します。

            fixed4 frag (v2f i) : SV_Target
            {
                // sample the texture
                fixed4 col = _MainColor; //tex2D(_MainTex, i.uv);
                // apply fog
                UNITY_APPLY_FOG(i.fogCoord, col);
                return col;
            }

これによってマテリアルの変数Colorの色を出力色として使用できるようになりました。

本日は以上です