渋谷ほととぎす通信

完全趣味でやってるUnityメモ。説明できないところを説明できるようにするための個人ブログ。昨日の自分より少しでも大きくなれるように。。。 ※所属団体とは一切関係がありません

最初理解しづらいReplaced Shadersの仕組み


f:id:esakun:20150730215258g:plain

Unityには結構前からReplaced Shadersという機能が提供されています。 これは特定のシェーダを置き換えてくれる便利機能です。

Unity - マニュアル: Replaced Shaders でのレンダリング

私自身結構前からこの機能の存在は知っていたのですが、リファレンスを読んでも分かりづらかったのでまとめます。

Replaced Shadersとは、SubShaderに定義されたタグで判定し、シェーダを置き換えて描画する仕組みです。

コチラのサンプルコードを御覧ください。

合計4つのシェーダーの中の、A1 〜 3のシェーダに以下のタグが設定されています。

  • A1 : Tags { "Hoge"="Piyo" }
  • A2 : Tags { "Hoge"="Foo" }
  • A3 : Tags { "Hoge"="Bar" }

シーン上ではこのようにマテリアルを設定した球を配置しています。

f:id:esakun:20170724114220p:plain

4つ目のシェーダReplace.shaderに以下の2つのタグを設定しています(SubShaderが2つあります)。

  • Tags { "Hoge"="Piyo" }
  • Tags { "Hoge"="Foo" }
var replaceShader = Shader.Find ("Replace");
Camera.main.SetReplacementShader (replaceShader, "Hoge");

このようにCameraのSetReplacementShader関数を使って置き換え用のReplace.shaderと、置き換えるキーとなるタグを指定(ここではHoge)します。

f:id:esakun:20170724114519p:plain

このコードを実行するとこのようにシェーダが置き換えられます。

左のA1、真ん中のA2は、それぞれ置き換え用のシェーダのタグとマッチするキーとバリューが存在したため、正常に置き換えられて描画されました。
※色が変わってしまったのは、置き換えシェーダ側の処理で色を変えています。

消えてしまった右のA3はは、キーHogeは存在しましたが、バリュー(Bar)が、置き換えシェーダ側に存在しな買ったため、描画対象から外されています。

このReplaced Shadersを使えば、特定のオブジェクトだけシェーダを動的に変更するといったことができそうであります。