Unity Pro Tips

オフィシャル記事詳細

シェーダーグラフの新機能

<このページで学べる内容>

この記事で学べる内容:シェーダーを視覚的に構築してリアルタイムで結果を確認することでシェーダーを簡単にオーサリングできる、Unity のシェーダーグラフの新機能とお勧めのワークフローについて説明します。Unite Copenhagen 2019 でのテクニカルエバンジェリスト Ciro Continisio による講演をベースとしています。

シェーダーグラフとは?

シェーダーグラフを使用すると、シェーダーを視覚的に作成できます。コードを記述する代わりに、グラフフレームワーク内にノードを作成して接続します。シェーダーグラフに即座にフィードバックされ、変更が反映されます。シェーダーの制作が初めての方でも、取っつきやすいものとなっています。

シェーダーグラフはスクリプタブルレンダーパイプライン(SRP)、つまりユニバーサルレンダーパイプライン(旧ライトウェイトレンダーパイプライン(LWRP))と HD レンダーパイプライン(HDRP)で機能するよう設計されています。また、シェーダーグラフは Unity の最新のデモ『FPS Sample』と『The Heretic』にも使用されています。 

シェーダーグラフは正式版です。つまり、検証済みパッケージ*であり、ご自身のプロジェクトに利用できることを意味します(*Unity の LTS バージョンの一部です)。

一般的な改善点

シェーダーグラフの初期リリースからの一般的な改善点をいくつか紹介します。

新しいマスターノード

マスターノードとはシェーダーグラフのエンドポイントのことで、グラフ上に作成するデータが埋め込まれるシェーダーのテンプレートが含まれます。ユニバーサルレンダーパイプラインには、4 つのマスターノードがあります。Unlit と PBR のほか、2D Renderer を使用している場合は、Unlit スプライトと Lit スプライトを使用することもできます。 

HD レンダーパイプライン(HDRP)には、6 つのマスターノードが用意されています。これらのマスターノードにより、HDRP でのみ実現できるビジュアルを制作できます。たとえば、(基本原理として 3 つのマテリアルが 1 つになった)StackLit マスターノードを使用すれば、元の金属の表面の上に複数のレイヤーのペイントを重ねることで、車のコーティングをシミュレートできます。

ユニバーサルレンダーパイプライン 

  • Unlit、PBR
  • Unlit スプライト、Lit スプライト

HD レンダーパイプライン(HDRP) 

  • Lit、Unlit
  • Fabric、Hair、Decal、StackLit

今後、ユーザーインターフェース(UI)機能、ポストプロセッシングスタック、Visual Effect Graph と連携するマスターノードの追加を予定しています。

精度

シェーダーグラフに追加されたもう 1 つの要素は、ノードの計算精度(float または half)を選択できる小さなドロップダウンメニューです。これにより、特定のデバイス(デスクトップ、モバイルなど)を対象とするシェーダーを作成し、プロジェクトのニーズに合わせてその精度を調整できます。精度はノード、グラフ、サブグラフレベルで調整できるほか、精度が継承されるかどうかを設定できます。

カラーモード

カラーモードを使用すると、色別にノードをカテゴライズできるほか、ノードの精度を視覚化するのにも使用できます。調整が必要なノードを特定したり、精度が逸脱している部分をマーキングしたりする必要があるときに便利です。実際、作業中に異なるカラーモードを複数回切り替えることは理にかなっています。これは、チームで共同作業しているときに特に便利です。一目で認識できるように、さまざまな色を特定のサブグラフやノードに割り当てることができます。

シェーダーグラフのアップデート

拡張されたサブグラフ機能

サブグラフは、他のグラフの内部で参照できるグラフを作成するのに使用されます。1 つのグラフの中や複数のグラフの間で同じ操作を複数回実行したり、グラフを整理したりする必要があるときに便利です。 

サブグラフにもたらされた改善点の 1 つが、出力ノードの出力に名前を付けるオプションです。特定のサブグラフを使用するときに、そのサブグラフの内部と外部で、それぞれ命名されたプロパティが表示されます。

さらに、サポートされるサブグラフの出力は、シェーダーグラフで使用される出力タイプと同じであるため、ワークフローがより明瞭になります。ほかにも、サブグラフを互いに無制限にネストできるようになったため、小さな機能のブロックを徐々に大きなグラフに配置し、これをマスターノードが含まれる最終的なグラフまで行うことができます。 

シェーダーグラフへのカスタム HLSL コードの追加

シェーダーグラフにカスタム HLSL コードを追加できるようにもなりました。 

HLSL は Custom Function ノードと呼ばれるノードの内部で直接使用するか、HLSL を外部ファイルから .hlsl 形式でインポートし、その後それをカスタム関数のリポジトリとして使用できます。ファイルのオプションは、関数に数行以上必要なときに使用することをお勧めします。

Custom Function ノードは、カスタム関数を受け入れる既製のノードです。これにより、カスタム HLSL コードを更新することなく、グラフを新しいバージョンのシェーダーグラフに更新できます。

上の画像は、2 つの数の合計を計算する、HLSL が埋め込まれた簡単な Custom Function ノードの例を示します。A と B はノード上の入力ポートです。その後、その合計が Sum というポートに出力されます。グラフ内の変数の名前がポートに対応していることがわかります。

より優れたエラー処理

グラフがコンパイルされないときは、そのグラフ内でエラーメッセージを確認できるようになりました。これらは、統合開発環境(IDE)に表示されるエラーメッセージと同じです。また、エラーに対処するためにグラフを変更する方法について理解する手助けとなるよう、多数の便利なヒントを追加しています。 

付箋とグループ

付箋機能を使用すると、グラフに注釈を付けることができます。一方で、グループを使用すると、オブジェクトやノードをグループにリンクしてタイトルを付けることができます。これらの機能により、グラフで作業しているチームメンバーにより多くのコンテキストを提供できます。グループでは、ノードを一括で移動したり削除したりすることもできます。これらの機能は両方とも、便利なコラボレーションツールです。

キーワード

キーワードは特殊なタイプの変数です。一見すると、Branch ノードで使用する普通の Boolean プロパティのように見えます。しかし、キーワードを使用するとシェーダーのバリアントを作成できます。これにより、エンジンでブランチごとに異なるバージョンのシェーダーがコンパイルされます。これはランタイムにおいて、両方のブランチが完全に実行される Branch ノードがある場合よりも効率的です。 ただし、キーワードごとにバリアントの数が指数関数的に増加するため、コンパイルにかかる時間はより長くなります。

例を次に示します。

  • 1 つの bool 型のキーワード = 2 倍のバリアント
  • 5 つの bool 型のキーワード = 32 倍のバリアント
  • それぞれ 4 つのオプションを備えた 3 つの enum 型のキーワード = 64 倍のバリアント

キーワードは Boolean 型または enum 型で、ローカルまたはグローバルにできます。キーワードのタイプとして、シェーダー機能、マルチコンパイル、事前定義済み、マテリアル品質があります。 

マテリアル品質は特殊なタイプのキーワードで、レンダリングパイプラインから直接入ってくるキーワードのことです。パイプラインで設定された品質レベルによって、詳細度に適合するか、エフェクトの移動と削除に使用される分岐パスを用意できます。ランタイムに、ユーザーにゲームの品質レベルを切り替えることができる能力を提供できます。その後、それに応じてマテリアル品質キーワードが指定されたシェーダーが反応します。 

シェーダーグラフとこの機能で作成できるシェーダーについてご質問、ご意見がある方は、専用のフォーラムスペースにアクセスしてください。また、Unity Learn のこちらのチュートリアルに従って、シェーダーグラフでできることについて詳細を学ぶことができます。 


 

この記事はいかがでしたか?