当然、CPUプログラム側からGPUプログラム(シェーダ)にデータを渡すことができますが、UnityのGameObjectにアタッチされたスクリプトからもシェーダに値を設定することが出来ます。
シェーダに値を送るにはMaterial
クラスを利用します。
trasferData2shader
private Material material;
// Use this for initialization
void Start () {
// 初期化時にマテリアルを保持しておく(ダイレクトにアクセスしてももちろんOK)
this.material = gameObject.renderer.material;
}
// Update is called once per frame
void Update () {
// 経過時間に応じて値が変わるよう適当な値を入れる
float r = Mathf.Sin(Time.time);
float g = Mathf.Sin(Time.time) + Mathf.Cos(Time.time);
float b = Mathf.Cos(Time.time);
// Materialクラスの`Set****`メソッドを使ってシェーダに値を送信
this.material.SetColor("_Color", new Color(r, g, b, 1.0f));
}
見てもらうと分かるように、シェーダにデータを送るのはとてもシンプルです。
第一引数の"_Color"
の部分はシェーダ側で定義されたプロパティ名です。
SetColor
という名称から分かるように、シェーダのプロパティで宣言できる型それぞれにSetterがあるようです。
第二引数はそれぞれの型に応じたクラスを使って値を設定します。
上記の例で言えばColor
クラスですね。
こちらのUnityのドキュメントを見ると、SetFloat(int nameID, float value)
とあるように、文字列による名前だけではなく、int型のnameID
を指定してもいいようです。