前回はシェーダプログラムの中で色の情報を直接指定していました。もうすこし、柔軟にパラメータを操作できるようにしましょう。
今回は、はじめにC#スクリプトからシェーダ内のパラメータを操作できるようにします。続いてインスペクタからもシェーダ内の変数を操作できるようにしてみます。
まずはスクリプトから色を設定する
インスペクタから設定するよりもC#スクリプトから値を設定するほうが簡単なので、まずはC#スクリプトから色を変更できるようにしてみます。シェーダファイルは下のような感じになります。
Shader "Custom/sample" { SubShader { Tags { "RenderType"="Opaque" } LOD 200 CGPROGRAM #pragma surface surf Standard fullforwardshadows #pragma target 3.0 struct Input { float2 uv_MainTex; }; fixed4 _BaseColor; void surf (Input IN, inout SurfaceOutputStandard o) { o.Albedo = _BaseColor.rgb; } ENDCG } FallBack "Diffuse" }
surfメソッドの上の行でfixed4型の_BaseColor変数を宣言しています。この変数をSurfaceOutputStandardのAlbedoに代入することで、_BaseColor変数で指定した色がマテリアルの色になります。
実はこれだけでC#スクリプトから_BaseColor変数の値を変更することができます。次のC#スクリプトを作成してみましょう。
using UnityEngine; using System.Collections; public class ShaderController : MonoBehaviour { void Start () { GetComponent<Renderer> ().material.SetColor ("_BaseColor", Color.black); } }
ここではmaterialのSetColorメソッドを使って、シェーダの中で宣言した_BaseColorに色を設定しています。スクリプトが書けたら、オブジェクトにアタッチして下さい。
実行すると次のように_BaseColorに黒色が設定されているのがわかります。
C#スクリプトからも色が変えられることが分かったところで、一旦C#スクリプトはオブジェクトから外しておきましょう。
インスペクタから色を設定する
次にインスペクタからも値を設定できるようにしましょう。シェーダファイルを次のように修正して下さい。
Shader "Custom/sample" { Properties{ _BaseColor ("Base 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 _BaseColor; void surf (Input IN, inout SurfaceOutputStandard o) { o.Albedo = _BaseColor.rgb; } ENDCG } FallBack "Diffuse" }
シェーダプログラムの先頭にPropertiesブロックを追加しています。Propertiesブロックに書いた変数がインスペクタから操作できるようになります。C#のpublic変数と同じような扱いですね。Propertiesブロックで使用するフォーマットは次のとおりです。
_BaseColor | "Base Color" | Color | (1,1,1,1) |
公開する変数名 | インスペクタ上の表示 | 型名 | 初期値 |
また、使用できる主な型名には次のようなものがあります。
型名 | 意味 |
---|---|
Color | 色を指定 |
Range(min,max) | 浮動小数点型で範囲指定 |
2D | テクスチャを指定 |
Float | 浮動小数点 |
この他にも、Unityには幾つか指定できるパラメータが用意されています。詳しくは、下記のページを参考にして下さい。
シェーダのパラメータを変更してみる
マテリアルのインスペクタを見ると、_BaseColor変数がインスペクタから操作できるようになっています。
シェーダのパラメータをインスペクタから変えられることを確かめてみましょう。ここではカラーウインドウをHSV表記にして、Hue(色相)を変更しています。
Unity5の教科書もよろしくお願いします!