渋谷ほととぎす通信

新しいこと、枯れたこと問わずサムザップ大庭が興味を持ったものを調査、生活の効率を求める完全趣味の技術ブログ。基礎を大事にしています。※あくまで個人ブログであり所属組織とは関係ありません

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


Unityにて、

  • UniversalRP
  • ShaderGraph

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

作っているもの

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

カラーテクスチャ マスク 合成後
f:id:esakun:20200629085130p:plain:w120 f:id:esakun:20200629085259p:plain:w120 f:id:esakun:20200629085314p:plain:w120

ShaderGraph

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

f:id:esakun:20200629084140p:plain:w450


拡大すると以下。 f:id:esakun:20200629084616p:plain:w450

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

Referenceがスクリプト参照キー

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

material.SetTexture("Texture2D_AD98B9C2C", _texture);

f:id:esakun:20200629084448p:plain:w450

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


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

検証環境

  • Unity2019.4.0f1

余談

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

Material doesn't have a texture property '_MainTex'
UnityEngine.Canvas:SendWillRenderCanvases()


以上です。