[Unity] C#プログラム側からシェーダに値を渡す

  • 20
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

当然、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を指定してもいいようです。