こんにちは、エンジニアのオオバです。

Unityにて、

この2つを使った描画の検証をしています。
ShaderGraphで書いたシェーダーに外からテクスチャをスクリプトで
渡す際に軽くつまづいたので共有します。

👉DOTweenの教科書を読んでUnityアニメーションをプログラミングしてみよう!

作っているもの

カラーテクスチャとマスクテクスチャを渡したマスクシェーダーを作っています。
以下の合成後の状態を作るシェーダーです。

カラーテクスチャマスク合成後
ShaderGraph テクスチャの参照をシェーダーに渡す部分でハマる。_MainTexはどこ?_0
ShaderGraph テクスチャの参照をシェーダーに渡す部分でハマる。_MainTexはどこ?_0
ShaderGraph テクスチャの参照をシェーダーに渡す部分でハマる。_MainTexはどこ?_0

ShaderGraph

右上のBackboardから公開プロパティの設定をします。

ShaderGraph テクスチャの参照をシェーダーに渡す部分でハマる。_MainTexはどこ?_1

拡大すると以下。

ShaderGraph テクスチャの参照をシェーダーに渡す部分でハマる。_MainTexはどこ?_2

+ボタンからプロパティは作れますが、その時につける名前がスクリプトから参照できるキーだと思ってのですが、違いました。

Referenceがスクリプト参照キー

調査した結果、Referenceがスクリプトから参照できるプロパティ名でした。上のキャプチャでは、以下のコードでテクスチャをセットできます。

material.SetTexture("Texture2D_AD98B9C2C", _texture);  

ShaderGraph テクスチャの参照をシェーダーに渡す部分でハマる。_MainTexはどこ?_3

Referenceの自動で生成されるっぽい名前がスクリプトから参照できる名前のようです。
ちなみに、最初リネームできることに気づかなくて、_MainTexを定義したいのに定義できない!という事にハマりました。

キャプチャのようにReferenceの文字列を_MainTexにリネームして解決しています。

余談

今回のシェーダーがuGUIのRawImageで使うシェーダーだったのですが、
_MainTexプロパティが存在しないと以下のエラーが出ます。

Material doesn't have a texture property '_MainTex'  
UnityEngine.Canvas:SendWillRenderCanvases()  
オススメ記事
検証環境