パハットノート

主にUnity(C#)を中心としたプログラムの備忘録

Unity Shader3D (1)基本とCubeの色変更





サイト内リンク

Shaderについてのまとめ記事

kiironomidori.hatenablog.com




参考サイト様

こちらの素晴らしすぎるサイトを参考にさせていただきました。
当記事より遥かに分かりやすいです!
nn-hokuson.hatenablog.com




Shaderの使用方法

UnityでShaderを使うためにまず次の2つを作成します。

  1. Materialの作成(「Create」⇒「Material」)
  2. Shaderの作成(「Create」⇒「Shader」⇒「Standard Surface Shader」)

作成したら次のようになります。


そうしたらTestMaterialにドラッグ&ドロップでTestShaderを追加します。すると、マテリアルが変化している様子が確認できます。





Shaderファイルの基本構成

まず、先ほど作成した「TestShader.shader」を開くとデフォルトでプログラムが記述されています。
しかし、デフォルトの状態では分かりにくいので以下の様に簡略化したうえでその構成を紹介します。


ファイルの構成

自分も青字の部分の詳細はよくわかっていません
ですが、赤字の部分は調べてある程度分かったので下の表で説明していきます。

番号 内容
Shaderの名前
先ほど作成した「TestShader」でしたら、Custom/TestShaderと記述されています。
恐らくデフォルトでは、「Custom/作成したファイル名」となるみたいです。
インスペクター上に表示する変数を記述します。
C#のファイルでいうpublicや[SerializeField]を付けた変数と同じようなものと考えています。
変数名("インスペクターでの表示名", 型) = 既定値
という風に宣言します。
メインとなる処理やそれに必要な変数の宣言などを行います。
OpaqueとなっているところをTransparentと変更すると透明の表示ができたりするみたいです。
入力構造体と呼ばれるそうです。
とりあえず今回は放置でいいです。
メインとなる処理を記述します
詳細などは後述。





Properies

ここからは実際にプログラムを記述してShaderについての理解を深めていきます。
早速、先ほど作成したTestShaderを次のように書き換えます。

Shader "Custom/TestShader"
{
    Properties
    {
        //インスペクターカラーパレットを表示する
        _Color("Color", Color) = (1,1,1,1)
    }

    SubShader
    {
        Tags { "RenderType" = "Opaque" }
        LOD 200

        CGPROGRAM
        #pragma surface surf Standard fullforwardshadows
        #pragma target 3.0

        struct Input
        {
            float2 uv_MainTex;
        };

        void surf(Input IN, inout SurfaceOutputStandard o)
        {
        }
        ENDCG
    }
        FallBack "Diffuse"
}


するとインスペクター上でColorというプロパティが表示されています。


しかし、ここでカラーパレットを変更しても何も起こりません。
次にオブジェクトをここのColorで指定した色に変更する方法を紹介します。




Cubeの色の変更

プログラム

TestShaderをShader次のように変更します。

Shader "Custom/TestShader"
{
    Properties
    {
        //インスペクターカラーパレットを表示する
        _Color("Color", Color) = (1,1,1,1)
    }

    SubShader
    {
        Tags { "RenderType" = "Opaque" }
        LOD 200

        CGPROGRAM
        #pragma surface surf Standard fullforwardshadows
        #pragma target 3.0

        struct Input
        {
            float2 uv_MainTex;
        };

        fixed4 _Color;

        void surf(Input IN, inout SurfaceOutputStandard o)
        {
            o.Albedo = _Color;
        }
        ENDCG
    }
        FallBack "Diffuse"
}



解説

ここで重要なのは

  • fixed4 _Color;
  • surf関数内のo.Albedo = _Color;

の2つです。


fixed4 _Color;

Propetiesに記述した「_Color」をsurf関数で使用できるようにします。Propetiesで宣言した変数名と同じにしないとダメっぽいです
fixed4とは「4次元ベクトルのfixed型」の変数という意味で、fixedは変数の精度を示しています。詳しくは公式ドキュメント「シェーダーのデータ型と精度」を参考にしてください。


o.Albedo = _Color;

引数のSurfaceOutputStandard型構造体oのAlbedoを書き換えることで色を変更することができます。SurfaceOutputStandardの重要な変数はこちらになります。詳しくは公式ドキュメント「サーフェスシェーダーの記述」を参考にしてください。

変数名 役割
Albedo
Alpha アルファ値を変更することで透明度を変えられます
Metallic 金属っぽさ



動作確認

TestShaderの動作を確認するために、Cubeオブジェクトを設置してTestMaterialを追加します。
そして、TestMaterialのColorを変更していくとCubeオブジェクトの色が変更されている様子が確認できます。