Shaderの使用方法
UnityでShaderを使うためにまず次の2つを作成します。
- Materialの作成(「Create」⇒「Material」)
- 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オブジェクトの色が変更されている様子が確認できます。