最近 Unity Labs から発表された論文で、法線マップをブレンドするための新しいフレームワークが紹介されました。これは、テクニカルアーティストとグラフィックスエンジニアの両方にとって、使いやすくて直感的なものです。このアプローチにより、従来の方法に存在していたいくつかの制約が克服されています。
法線マッピングがリアルタイムコンピューターグラフィックスに導入されて以来、法線マップを数学的に正しい方法で結合またはブレンドして、視覚的に美しい結果を得ることは、経験豊富なグラフィックスエンジニアにとっても難しい課題でした。古くから、開発者は法線をワールド空間でブレンドすることがよくあり、それが不正確で不十分な結果を得ることにつながっていました。論文「Surface Gradient Based Bump Mapping Framework(表面勾配ベースのバンプマッピングフレームワーク)」では、従来の法線マッピングに関する制約を解消する、新しいフレームワークが紹介されています。この新しいアプローチは、形式の異なるバンプマップを結合する場合でも、テクニカルアーティストとグラフィックスエンジニアの両方にとって、使いやすく直感的なものとなっています。
現代のコンピューターグラフィックスにおいて、マテリアルレイヤリングはリッチで複雑な環境を実現するために不可欠なものです。これを実現するには、複数のテクスチャー座標セットをカバーしたバンプマッピングと、複数のバンプマップ間でのブレンドをサポートする必要があります。また、オブジェクト空間法線マップ上でバンプスケールを調整したり、それらのマップを接空間法線マップや 3 平面投影を使って正しく合成/ブレンドする機能も必要になります。
これまで、リアルタイムグラフィックスでは 1 つのテクスチャー座標セットに対してのみ、バンプマッピングがサポートされていました。バンプマッピングでは、すべての頂点のデータが事前に計算され、保存される必要があります(接空間)。追加のテクスチャー座標セットをサポートするには、頂点あたりの追加ストレージも相応分必要になります。また、これを行っても、プロシージャルジオメトリ/テクスチャー座標や、ジオメトリの高度な変形はサポートされません。
HD レンダーパイプライン(HDRP)は、バンプマッピングに表面勾配ベースのフレームワークを使用することで、この問題を解決するソリューションです。HDRP では、最初のテクスチャー座標セットに従来の接空間(頂点あたり)を使用することで、MikkTSpace への厳密な準拠がサポートされています。これは、処理の難しいケースにおいて必須の要件となります(低ポリゴンのハードサーフェスジオメトリ用に作成されたベイク済み法線マップなど)。
後続のテクスチャー座標セットについてはすべて、ピクセルシェーダーでリアルタイムに接空間を計算します。これにより、すべてのテクスチャー座標セットの法線マッピングをサポートできるだけでなく、プロシージャルジオメトリや、シンプルなスキニング以外の高度な変形にも対応できるようになっています。
正確なブレンドは、上記の論文で説明されているように、表面勾配を累算することで実現されます。
これまで、このフレームワークは HDRP 内に組み込まれたシェーダーを使用している場合にのみ利用可能でした。しかしこの度、シェーダーグラフ用に作成されたプロトタイプバージョンが Github で公開され、Unity 2019.3.0b4 とシェーダーグラフバージョン 7.1.2 で作成されたサンプルシーンとして提供を開始されました。フレームワーク自体はシェーダーグラフ用のサブグラフとして完全に実装されており、各サブグラフはビルトインノードだけで作成されています。
この方法では、次の手順で作業を行います。
このフレームワークに準拠することで、すべての形式のバンプマップから表面勾配が生成され、均一な処理が可能になります。これには、接空間/オブジェクト空間法線マップ、平面投影、3 平面投影のほか、プロシージャル 3D テクスチャー形式のバンプマップも含まれます。これにより、正確なブレンドを容易に実行できるようになっています。
サンプルには、このフレームワークを使用するグラフがいくつか含まれています。各グラフは、このフレームワークの異なるユースケースを例示したものとなっています。以下のセクションでは、これらの一部について説明していきます。
シェーダー basic のグラフでは、フローだけでなく、頂点の接空間を使用した場合とプロシージャルの接空間を使用した場合との違いも示されています。
このサンプルでは UV0 が使用されているため、Blackboard の Boolean プロパティがトグルとして機能します。その他の UV セットについては、シェーダーで 2 つ目の方法を使用する必要があります。
なお、接空間法線マップのサンプリングには特別なサブグラフ(tex ts norm to deriv.shadersubgraph)が使用されています。このサブグラフは、vector3 を返す代わりに、デリバティブと呼ばれる vector2 を返します。複数のデリバティブを同じ UV セットを使用してサンプリングする場合には、それらを加算したりブレンドしたりすることができます。ただし、異なる UV セットや、異なる形式のバンプマップを使用している場合に加算やブレンドを行えるようにするには、表面勾配を加算またはブレンドする必要があります。
表面勾配を生成するには、Surfgrad TBN.shadersubgraph(上記)というサブグラフを使用します。
表面勾配でのバンプスケールを調整するには、シンプルな Multiply ノードを使用します。また、Apply Bump Scale.shadersubgraph というサブグラフを使用することもできます。
その後、サブグラフ Resolve Surfgrad.shadersubgraph を使用することで、表面勾配を最終的なバンプマッピング済みの法線へと変換できます。
表面勾配ベースのワークフローには、オブジェクト空間法線マップも統合されています。これにより、バンプマッピングの強度を調整したり、オブジェクト空間法線マップを他の形式のバンプマップとブレンド/加算できるようになっています。
次に示すのは、OS nmap basic というグラフです。
最初に、サンプリングされた法線をオブジェクト空間からワールド空間にトランスフォームします。最善の結果を得るため、これは法線としてトランスフォームされますが、シェーダーグラフのビルトイン変形ではこれがサポートされていないため、Direction が最善のオプションとなります。その後、Normal to surfgrad.shadersubgraph というサブグラフを使用して、法線を表面勾配に変換します。バンプコントリビューションが表面勾配になったら、他の形式のバンプマップと同様に手順を進めます。つまり、前のセクションで説明したようにバンプスケールを調整し、複数の表面勾配を加算/ブレンドした後、リゾルブして最終的な法線を生成します。
3 平面投影とは、バンプマップを 3D テクスチャーとして表す特殊な投影方法です。論文「Surface Gradient Based Bump Mapping Framework」では、これを実行するための詳細な計算方法が説明されています。次の図は、従来の法線マップブレンド(左)と表面勾配ベースのアプローチ(右)を比較したものです(Siggraph 2018 での Unity のプレゼンテーションより引用)。
グラフ Triplanar では、この方法でブレンドが実行されます。具体的には、サブグラフ Triplanar to surfgrad.shadersubgraph を使用して、3 平面投影から表面勾配が生成されます。前述のように、バンプスケールを使用して表面勾配を調整し、表面勾配を他の表面勾配にブレンド/加算した後、リゾルブして最終的な法線を取得できます。
このフレームワークの最も便利な点は、任意の数のテクスチャー座標セット(プロシージャル UV を含む)を対象にして、バンプマップのカテゴリや数を問わず、それらを正しくブレンドできるという点です。下記の図は、3 種類のバンプマップ(タイル状の接空間法線マップ、オブジェクト空間法線マップ、およびプロシージャル 3D テクスチャーとしてのバンプマップ)がブレンドされた場合の例です。
グラフ Mixing では、この方法でブレンドが実行されます(下記を参照)。各バンプマップが、それぞれのバンプマップ強度に応じて調整された表面勾配になり、それらが加算またはブレンドされて、表面勾配が合成されます。最後に、合成された表面勾配がリゾルブされ、最終的な法線が生成されます。
Unity のサンプルシーンには、他にもいくつかの例が含まれています。たとえば、法線マッピング済みのサーフェスに適用された 3 平面投影、 パララックス修正またはパララックスオクルージョンマッピング(POM)の後に適用された詳細法線マッピング、ハイトマップからのバンプマッピング、プロシージャル 3D テクスチャーを使用したバンプマッピングなどが含まれています。
このフレームワークは、完成済みのノードを含んだサブグラフを使用して実装できるため、シェーダーグラフの優れた機能と柔軟性を証明するものとなっています。ただし、いくつかの問題点があるため、このフレームワークは UV0 用の MikkTSpace には完全準拠していません。Unity では、次の問題の解消に積極的に取り組んでいます。
シェーダーグラフではバンプされた法線が UV0 の接空間のマスターノードに提供される必要があるため、オブジェクト空間法線マップを使用する際や、3 平面法線マップを使用する際にも問題が生じます。将来的には、ワールド空間のマスターノードに法線を提供できるようにすることで、この問題が解決される予定です。
なお、HDRP のビルトインシェーダーではこの問題は存在せず、MikkTSpace に完全に準拠しています。
シェーダーグラフでシェーダーを視覚的に作成し、それらを Visual Effect Graph で使用して、カスタムの外観とレンダリング動作を作成できるようになりました。シェーダーキーワードが追加されたことで、グラフ内に静的ブランチを作成できるようになりました。これは、独自のシェーダー LOD システムを構築するなどの目的に使用できます。また、DOTS アニメーションでの頂点スキニングのサポートが追加され、より優れた水と植生のオーサリングが可能になりました。さらに、付箋機能を使用すると、プロジェクトに携わる誰にでもコメントや説明を残すことができ、ワークフローが改善されます。最後に、プロシージャルパターンのサブグラフのサンプルでは、演算を使用してプロシージャルのシェイプとパターンを作成する方法について説明しています。
--
シェーダーグラフフォーラムからフィードバックをお寄せください