Shader Graph で HDRP マテリアルをカスタマイズする
HD レンダーパイプライン (High Definition Render Pipeline、HDRP) は、AxF シェーダーを除くすべてのシェーダーに、Unity の Shader Graph (シェーダーグラフ) を使います。つまり、マテリアルの中には 通常のマテリアルとは作成および編集方法が異なるものがあります。
シェーダーグラフを使う HDRP マテリアル
HDRP には次のシェーダーグラフが含まれます。
- Decal
- Fabric
- Hair
- Lit
- StackLit
- Unlit
Lit、Layered Lit、および Unlit シェーダー は、標準シェーダー (シェーダーグラフなし) として利用できます。つまり、シェーダーグラフインスタンスを作成せずに使うことができ、Inspector で編集できます。これらを使用するためには、Inspector で表示するマテリアルを選択してから Shader ドロップダウンをクリックします。なおシェーダーグラフインスタンスが必要でない HDRP シェーダーのリストは、HDRP セクションにあります。
作成
シェーダーグラフを使うマテリアルの作成は (StackLit グラフなど)、次のステップに従ってください。
- マテリアルに使いたいシェーダーグラフのあるシェーダーを作成します。
- Assets > Create > Shader > HDRP に行き、HDRP シェーダーグラフのリストを見つけます。例えば、StackLit Graphs をクリックします。
- シェーダーグラフに一意の名前を付けます。これは、マテリアル内のシェーダーグラフを参照するために必要になるため重要です。
- Assets > Create > Shader > HDRP に行き、HDRP シェーダーグラフのリストを見つけます。例えば、StackLit Graphs をクリックします。
- シェーダーからマテリアルを作成します。
- プロジェクトウィンドウで、たった今作成したシェーダーを探して右クリックします。
- Create > Material を選択します。これで選択したシェーダーを使うマテリアルができました。なお、必ずこの方法に従ってください。デフォルトマテリアルを作成して、マテリアルの Shader ドロップダウンからシェーダーを選んではいけません。その理由については、既知の問題 を参照してください。
- マテリアルに名前を付け、キーボードのエンターキーを押してください。
編集
シェーダーグラフを使うマテリアルのプロパティ―を編集する際、Inspector ウィンドウは限られた数のプロパティーにのみアクセスを許可します。すべてのマテリアルプロパティーを編集するためには、シェーダーグラフのマスターノードを直接編集しなければなりません。
- ダブルクリックでシェーダーグラフアセットを開きます。ウィンドウにマスターノードと利用可能な入力のリストが表示されます。以下のスクリーンショットの Surface Inputs セクションから確認してください。
- その他、残りのプロパティーは、マスターノードの右上にあるギアをクリックして展開します。その他のプロパティーを、以下のスクリーンショットの Surface Options セクションから、確認してください。
- Inspector ウィンドウと同様に、ギアのプロパティーを編集します。マスターノードの入力リスト、およびギアーのリストで利用可能なプロパティーは、選択するオプションによって変わります。
マテリアルプロパティー
シェーダーグラフアセットを編集する際に、Blackboard でマテリアルが使うプロパティーを作成することができます。これにより、ランタイムにプロパティーの値を変更することが可能になります。
プロパティーを作成する最善の方法は、状況によって変わります。
- Editor でプロパティーを編集をしたい場合は、Blackboard を使ってプロパティーを展開します。
- ランタイムにプロパティーを編集したいものの Editor で編集したくない場合は、Blackboard を使いますが、プロパティーを展開しません。
- プロパティーを編集したくない場合は、コンクリートノードを使用します。
Blackboard のマテリアルプロパティー
Blackboard プロパティーはすべて、展開しても展開しなくても、ディスク上のマテリアルのサイズに影響します。プロパティーの値を (Editor で、またはランタイムに) 全く変更する必要がなければ、マテリアルのサイズが増さないように、コンクリートノードを代わりに使ってください。
Unity Editor Inspector でマテリアルのプロパティー値を変更したい場合は、そのプロパティーを展開する必要があります。Blackboard のプロパティーをInspector で展開するには、
- マテリアルが使用しているシェーダーグラフアセットを開きます。
- Blackboard へ行き、Inspector で表示したい展開されたプロパティーの設定を有効にします。
- ツールバーで Save Asset をクリックします。
- シェーダーグラフアセットからマテリアルを作成する際に、 Exposed Properties セクションにプロパティーが表示されます。
Editor でアプリケーションを開発する際は、Inspector で変更する予定のプロパティーのみを展開してください。そうでなければ、Inspector でスペースを取りすぎないように、また間違って変更しないためにも、そのまま展開せずにしておくべきでしょう。
プロパティーが展開されなくても、編集は可能です。選択したシェーダーを使うマテリアルインスタンスすべてのプロパティーを編集するには、シェーダーグラフアセットを開き、Blackboard で直接プロパティーを編集します。シェーダーを使う単体のマテリアルインスタンスのプロパティーを編集するには、スクリプトを使います。
⚠️ HDRP には、Blackboard で使ってはいけないプロパティー名がいくつかあります。それらを使うと、マテリアルが正常に機能しない可能性が高くなります。 制限されているプロパティー名のリストとその使い道については、次の表を参照してください。
プロパティー名 | HDRP 使用 |
---|---|
_EmissionColor |
グローバルイルミネーションエミッションカラー |
_BaseColor |
グローバルイルミネーションアルファクリップ |
_BaseColorMap |
グローバルイルミネーションアルファクリップ |
_RenderQueueType |
HDRP がレンダーキューでマテリアルのスケジュールを組む、レンダラーキューのタイプ。 |
_UseShadowThreshold |
HDRP 内部 |
_RequireSplitLighting |
HDRP 内部 |
_ReceivesSSR |
Surface Option |
_TransparentDepthPrepassEnable |
Surface Option |
_TransparentDepthPostpassEnable |
Surface Option |
_SurfaceType |
Surface Option |
_DoubleSidedEnable |
Surface Option |
_AlphaCutoffEnable |
Surface Option |
コンクリートノードのマテリアルプロパティー
シェーダーを使うマテリアルすべてに同じプロパティー値を使いたい場合、さらにランタイム時またはエディターでそれを変更する必要がない場合は、コンクリートノードを使うことができます。コンクリートノードは、値を定義するシェーダーグラフアセットで作成できるノードです。Blackboard と同様、すべての値のタイプにコンクリートノードを作成できます。シェーダーコンパイラーがパフォーマンス向上のために自動最適化を実行できるよう、できるだけコンクリートノードを使ってください。
テクスチャ (またはテクスチャ配列) を定義するコンクリートノードは、シェーダーで展開されないプロパティーを定義します。つまり、Blackboard プロパティーと同様に、マテリアルのサイズに影響するという意味です。
マテリアルの Surface Option プロパティー
デフォルトにより、HDRP マスターノードでは多くの Surface Option にアクセスできます。それらを使うと、シェーダーグラフの代わりにマテリアルから一般的な設定を制御することができ、例えば Sorting Priority や Surface Type を変更するグラフを丸々複製する必要がなくなります。これらの設定はマスターノードでは Shader のデフォルト値となり、Shader Graph からマテリアルを作成すると (Shader Graph のアセットを右クリック > Create > Material)、マスターノードの設定が与えられます。
このシステムはグラフの複製防止に最適ですが、プロパティーの同期化に関する問題がいくつか発生します。例えば、透明 Shader Graph からマテリアルを作成し、マスターノード設定で Surface Type を不透明に切り替えても、作成したマテリアルは透明のままになります。一度マテリアルを作成すると、そのプロパティーはすべて保存され、Shader Graph と同期化されることはありません。これはマテリアルを全く変更しない場合も当てはまります (オーバーライドシステムがないことが主な理由です)。
これらのサーフェスオプションの切り替えは、編集モードでのみ可能で、プレイヤーではできませんのでご注意ください。 このおかげで、シェーダーの編集プロセスに余計なバリアントが追加されることはありません (マルチコンプライの代わりにシェーダー機能を使います)。
既知の問題
新しマテリアルを作成する際は、(マスターノード設定の) デフォルトのシェーダーグラフプロパティーから引き継がなければなりません。作成 セクションで説明されている方法を使って実行してください。この方法に従わず、代わりに Assets > Create > Material を使ってマテリアルを作成すると、Unity はマテリアルに Lit シェーダーを割り当てて、すべてのデフォルト Lit シェーダープロパティーを書き込みます。つまり、シェーダーグラフをマテリアルに割り当てる際に、マテリアルがシェーダーグラフマスターノードからではなく、Lit シェーダーからデフォルトのプロパティーを使うことになります。
シェーダーグラフでマスターノードのプロパティーを変更する際、マテリアルがInspector で開いていない限り、Unity はマテリアルと同期化しません。つまりマスターノード設定で Material Type などのプロパティーを変更すると、Inspector で開いていないマテリアルは同期化されず、同期化されないマテリアルのレンダリングは破損します。マテリアルのプロパティ―とシェーダーグラフのレンダリングおよび同期化を修正するには、以下を実行してください。
- Inspector でマテリアルを開き、プロパティーの 1 つの値を変更してから、もう一度変更して元に戻します。これでマスターノードとマテリアルの同期が誘発され、マテリアルを修復します。
- プロジェクトの C# スクリプトから
HDEditorUtils.ResetMaterialKeywords(Material)
を呼び出し、パスさせるマテリアルのプロパティーとマテリアルのシェーダーグラフを同期化します。