Search Unity

シェーダーグラフの表面勾配フレームワークを使用した法線マップコンポジティング

, 11月 20, 2019

最近 Unity Labs から発表された論文で、法線マップをブレンドするための新しいフレームワークが紹介されました。これは、テクニカルアーティストとグラフィックスエンジニアの両方にとって、使いやすくて直感的なものです。このアプローチにより、従来の方法に存在していたいくつかの制約が克服されています。

法線マッピングがリアルタイムコンピューターグラフィックスに導入されて以来、法線マップを数学的に正しい方法で結合またはブレンドして、視覚的に美しい結果を得ることは、経験豊富なグラフィックスエンジニアにとっても難しい課題でした。古くから、開発者は法線をワールド空間でブレンドすることがよくあり、それが不正確で不十分な結果を得ることにつながっていました。論文「Surface Gradient Based Bump Mapping Framework(表面勾配ベースのバンプマッピングフレームワーク)」では、従来の法線マッピングに関する制約を解消する、新しいフレームワークが紹介されています。この新しいアプローチは、形式の異なるバンプマップを結合する場合でも、テクニカルアーティストとグラフィックスエンジニアの両方にとって、使いやすく直感的なものとなっています。

現代のコンピューターグラフィックスにおいて、マテリアルレイヤリングはリッチで複雑な環境を実現するために不可欠なものです。これを実現するには、複数のテクスチャー座標セットをカバーしたバンプマッピングと、複数のバンプマップ間でのブレンドをサポートする必要があります。また、オブジェクト空間法線マップ上でバンプスケールを調整したり、それらのマップを接空間法線マップや 3 平面投影を使って正しく合成/ブレンドする機能も必要になります。

これまで、リアルタイムグラフィックスでは 1 つのテクスチャー座標セットに対してのみ、バンプマッピングがサポートされていました。バンプマッピングでは、すべての頂点のデータが事前に計算され、保存される必要があります(接空間)。追加のテクスチャー座標セットをサポートするには、頂点あたりの追加ストレージも相応分必要になります。また、これを行っても、プロシージャルジオメトリ/テクスチャー座標や、ジオメトリの高度な変形はサポートされません。

HD レンダーパイプライン(HDRP)は、バンプマッピングに表面勾配ベースのフレームワークを使用することで、この問題を解決するソリューションです。HDRP では、最初のテクスチャー座標セットに従来の接空間(頂点あたり)を使用することで、MikkTSpace への厳密な準拠がサポートされています。これは、処理の難しいケースにおいて必須の要件となります(低ポリゴンのハードサーフェスジオメトリ用に作成されたベイク済み法線マップなど)。

後続のテクスチャー座標セットについてはすべて、ピクセルシェーダーでリアルタイムに接空間を計算します。これにより、すべてのテクスチャー座標セットの法線マッピングをサポートできるだけでなく、プロシージャルジオメトリや、シンプルなスキニング以外の高度な変形にも対応できるようになっています。

正確なブレンドは、上記の論文で説明されているように、表面勾配を累算することで実現されます。

これまで、このフレームワークは HDRP 内に組み込まれたシェーダーを使用している場合にのみ利用可能でした。しかしこの度、シェーダーグラフ用に作成されたプロトタイプバージョンが Github で公開され、Unity 2019.3.0b4 とシェーダーグラフバージョン 7.1.2 で作成されたサンプルシーンとして提供を開始されました。フレームワーク自体はシェーダーグラフ用のサブグラフとして完全に実装されており、各サブグラフはビルトインノードだけで作成されています。

この方法では、次の手順で作業を行います。

  1. 各バンプマップの表面勾配を作成する。
  2. ユーザー定義のバンプスケールによって各表面勾配をスケーリングする。
  3. すべての表面勾配を 1 つに加算(またはブレンド)する。
  4. リゾルブして、最終的なバンプマッピング済みの法線を生成する。

このフレームワークに準拠することで、すべての形式のバンプマップから表面勾配が生成され、均一な処理が可能になります。これには、接空間/オブジェクト空間法線マップ、平面投影、3 平面投影のほか、プロシージャル 3D テクスチャー形式のバンプマップも含まれます。これにより、正確なブレンドを容易に実行できるようになっています。

サンプルには、このフレームワークを使用するグラフがいくつか含まれています。各グラフは、このフレームワークの異なるユースケースを例示したものとなっています。以下のセクションでは、これらの一部について説明していきます。

基本的な法線マッピング

シェーダー basic のグラフでは、フローだけでなく、頂点の接空間を使用した場合とプロシージャルの接空間を使用した場合との違いも示されています。

  1. サブグラフbasisMikkTS.shadersubgraphでは、従来型の接線と従接線が生成されます。これは UV0 に対してのみ機能します。
  2. プロシージャルの接線と従接線は、サブグラフ GenBasisTB.shadersubgraph で、任意のテクスチャー座標を使用して取得されます。

このサンプルでは 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 平面投影

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 では、次の問題の解消に積極的に取り組んでいます。

  1. シェーダーグラフでは現在、正規化されていない(補間後の)接線、従接線、および法線へのアクセスが提供されていません。これらは、MikkTSpace に完全準拠するための必須要件です。
  2. シェーダーグラフでは、最終的にバンプされた法線が UV0 の接空間で提供される必要があります。現在、これに準拠した変形にシェーダーグラフでアクセスすることはできないため、問題点となっています。

シェーダーグラフではバンプされた法線が UV0 の接空間のマスターノードに提供される必要があるため、オブジェクト空間法線マップを使用する際や、3 平面法線マップを使用する際にも問題が生じます。将来的には、ワールド空間のマスターノードに法線を提供できるようにすることで、この問題が解決される予定です。

なお、HDRP のビルトインシェーダーではこの問題は存在せず、MikkTSpace に完全に準拠しています。

2019.3 の新機能

シェーダーグラフでシェーダーを視覚的に作成し、それらを Visual Effect Graph で使用して、カスタムの外観とレンダリング動作を作成できるようになりました。シェーダーキーワードが追加されたことで、グラフ内に静的ブランチを作成できるようになりました。これは、独自のシェーダー LOD システムを構築するなどの目的に使用できます。また、DOTS アニメーションでの頂点スキニングのサポートが追加され、より優れた水と植生のオーサリングが可能になりました。さらに、付箋機能を使用すると、プロジェクトに携わる誰にでもコメントや説明を残すことができ、ワークフローが改善されます。最後に、プロシージャルパターンのサブグラフのサンプルでは、演算を使用してプロシージャルのシェイプとパターンを作成する方法について説明しています。

シェーダーグラフフォーラムからフィードバックをお寄せください

11 replies on “シェーダーグラフの表面勾配フレームワークを使用した法線マップコンポジティング”

“We have added Shader Keywords, which can create static branches in your graph. Use this for things like building your own Shader LOD system.”

This merits its own blog post or training session. Anyone planning to address this? This is the first I’ve heard of Shader Graph being capable of complex branching akin to Unreal shaders.

Also, with complex techno-posts like this blog, why not say something like:

“To sum it up, [insert thing this blog post helps you do here] will allow you to render textures in multiple ways for things like [insert one use-case here], [insert another use-case here], and [insert final use-case here].

More info will be available for each of these use cases here:
[insert URL(s)]”

Most of the time Unity’s tech blog posts tend to fly way over most people’s heads. This could ease some unnecessary tension from users who didn’t understand what Unity was actually capable of. Capeesh?

Hi Morten,
Why not compute the tangent also for the UV0 using the tangent generation calculation from your paper?
That can avoid vertex data + interpolation and fix for blendshape tangent.
Thanks!

Hi Alundra,

You absolutely can use the “on the fly” approach across the board and in my experience it works perfectly well on the vast majority of cases. Where it falls short is when people want to do tricky low poly hard surface cases without bevels (ie. low poly cases with very bad vertex normals). For these you still need to use vertex level tangent space to get strict compliance and continuity.
In the context of blend shapes, if you are using the built-in Lit shader in hdrp, I’d say just use a different uv set than uv0 and you’ll get the “on the fly” approach. As for Shader Graph using this framework you can do it however you like. Using “on the fly” method on everything is a perfectly reasonable to ship a game and as you point out it means fewer interpolators. Heavy use of interpolators puts pressure on the parameter cache which leads to starvation of gpu cores.

hi morton,
thanks a lot for this heads up, much appreciated.
but even more important i think is the fact that we actually see some efforts from all the people unity acquired during the last years.
what is natalia working on, what part did sebastian aalton took over? you are so invisible to the community!

Hi Lars,

First thank you for expressing direct interest in our work. We are often working on a collective effort and our corner of this will most often not turn into an individual blog post. In my case I wrote the tiled (fptl) and the clustered light/refl probe list building that is in HDRP.

Comments are closed.