おもちゃラボ

Unityで遊びを作ってます

【Unityシェーダ入門】シェーダのパラメータをインスペクタから設定する

 
前回はシェーダプログラムの中で色の情報を直接指定していました。もうすこし、柔軟にパラメータを操作できるようにしましょう。

nn-hokuson.hatenablog.com

今回は、はじめに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に色を設定しています。スクリプトが書けたら、オブジェクトにアタッチして下さい。
 
f:id:nn_hokuson:20161003204209p:plain
 
実行すると次のように_BaseColorに黒色が設定されているのがわかります。

f:id:nn_hokuson:20160911230711p:plain

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には幾つか指定できるパラメータが用意されています。詳しくは、下記のページを参考にして下さい。

docs.unity3d.com

シェーダのパラメータを変更してみる

マテリアルのインスペクタを見ると、_BaseColor変数がインスペクタから操作できるようになっています。
 
f:id:nn_hokuson:20161002203521p:plain
 
シェーダのパラメータをインスペクタから変えられることを確かめてみましょう。ここではカラーウインドウをHSV表記にして、Hue(色相)を変更しています。
 
f:id:nn_hokuson:20161003205022p:plain

f:id:nn_hokuson:20161002203618g:plain
 

Unity5の教科書もよろしくお願いします!