物理ベースシェーディングの使用:実用的なアプローチ

Unity 5 の開発期間中、Unity では社内で Viking Village プロジェクトをシェーディングとライティングのワークフローのテスト環境として使用してきました。
Unity 5 ベータ版をお使いの方は、アセットストアから Viking Village パッケージをダウンロードして、Unity 5 でのシーンの組み立て方や照明の方法をご確認ください。また、以下にいくつかの知見を紹介します。
テクスチャとシェーダーの設定が適切に動作していることを確認するには、様々なライティング設定のあるシンプルなシーンを使用することをお勧めします。これは、異なるスカイボックスやライトなど、モデルへの照明に寄与するものであれば何でも構いません。
Unity 5 を開くと、新しい空のシーンには、デフォルトの環境光設定やリフレクション設定と同様に、プロシージャルスカイが設定されていることに気づくでしょう。ここを出発点とするのが適切だと思われます。
テンプレート環境には、以下のものを使用しました。
- HDR カメラレンダリング
- 2、3 個点在させたリフレクションプローブ(物体上の局所的な反射を再現するため)
- まとまった数のライトプローブ
- HDR のスカイテクスチャとマテリアル、およびプロシージャルスカイのセット。このプロジェクトに同梱されているスカイは、「Dutch Skies 360」の作者である Bob Groothuis 氏が Unity 用にカスタムメイドしたものです。
- 強度と HDR のスカイカラーを一致させたオフホワイトのディレクショナルライト
スカイテクスチャのパノラマを調整する
ほとんどのスカイテクスチャには太陽が(フレアなども一緒に)入っており、太陽からの光は表面で反射します。これにより、3 つの問題が発生する可能性があります。
1) 太陽を表現するために使用するディレクショナルライトは、スカイボックスに描かれた太陽の方向と正確に同じ方向を向いている必要があります。そうしないと、マテリアルの表面に複数のスペキュラー反射のホットスポットが現れてしまいます。
2) 反射した太陽とスペキュラー反射のホットスポットが重なり、強すぎるスペキュラーハイライトの原因になります。
3) ベイクされた太陽の反射は、表面が影になっている場合にも遮蔽されないため、シーンが暗いときは過度な光沢が出てしまいます。
太陽をスカイテクスチャから消去し、ディレクショナルライトとレンズフレアを使って再現する。
その結果、太陽のハイライト、フレア、太陽光線、HDR 値をスカイテクスチャから編集し、ディレクショナルライトを使用して再適用する必要があります。.
物理ベースのシェーディングマテリアルのオーサリング
現実世界の質感を再現しようというときに当て推量で作業をすることを避けるには、すでに知られた信頼のおけるリファレンスに従うのがいいでしょう。スタンダードシェーダーは、スペキュラカラーとメタリックの両方のワークフローをサポートしています。どちらも表面から出る反射光の色を定義します。スペキュラーのワークフローでは色は直接指定されるのに対して、メタリックワークフローでは色は拡散色とスタンダードシェーダーの制御項目で設定されたメタリックの値の組み合わせから導き出されます。
Viking Village プロジェクトでは、スタンダードシェーダーのスペキュラーカラーワークフローを使用しました。アセットストアからダウンロードできる較正用のシーンには、便利な較正用チャートが含まれています。マテリアルをデザインする際には、このチャートを定期的に参照しました。
マテリアルにアプローチする際には、スペキュラーワークフローとメタリックワークフローのどちらかを選択することができ、それぞれに独自の値と参照用のチャートが用意されています。スペキュラワークフローでは、鏡面反射した光の色を直接選択し、メタリックワークフローでは、材料が照らされたときに金属のように振る舞うかどうかを選択します。
スペキュラー値のチャート
メタリック値のチャート

スペキュラーワークフローとメタリックワークフローのどちらを選択するかは、主に個人の好みの問題ですが、どちらのワークフローを選択しても、通常は同じ結果を得ることができます。
チャートや値の他に、現実世界で見られる表面のサンプルを収集することは非常に価値があります。模倣しようとしている種類の表面を見つけ、それが光にどのように反応するかを理解することは非常に役立ちます。
マテリアルの設定
最初のうちは、較正用チャートから派生した色、値、スライダーを使用して、素朴ながら調整可能なマテリアルの表現を作成すると便利なことがよくあります。その後、元のマテリアルを参照しながらテクスチャを適用して、特性が保持されていることを確認することができます。
上段:テクスチャなし。下段:テクスチャを施した状態。左から右の順に、岩、木材、骨、金属。
Viking Village のテクスチャは、従来の手動による方法(写真と微調整)と、Quixel 社から提供された拡散/アルベド、スペキュラー、グロス、法線マップのスキャン画像の両方を使用してオーサリングされています。
マテリアルのテクスチャチャンネルにディテールを追加する際には注意が必要です。たとえば、通常、テクスチャにはライティング(アンビエントオクルージョン、シャドウなど)を配置しないほうが賢明です。物理ベースレンダリングのアプローチを取れば、必要となるライティングはすべて提供されます。
当然のことながら、写真のレタッチはスキャンデータを使用するよりも、特に物理ベースシェーディング(PBS)に適した値を考えるとなると、より難しいものになります。Quixel Suite や Allegorithmic Substance Painter など、プロセスを簡単にするためのツールがあります。
スキャンされたデータ
PBS で較正されたスキャンテクスチャを使用すると、データはすでにチャンネル別に分離されており、アルベド、スペキュラー、スムースネスの値が含まれているため、編集の必要性が軽減されます。PBS で較正されたデータを提供するソフトウェアに、エクスポート用の Unity プロファイルが含まれているとベストです。Photoshop や関連ツールを使用して値を較正する必要がある場合は、常に参照用チャートをサニティチェックとして、またガイドとして使用することができます。
マテリアルの例
Viking Village シーンでは、テクスチャのメモリ消費量を適度な範囲内に収まるように工夫しながら、大量のコンテンツを用意しています。例として、高さ 10m の木製クレーンをどのように設定したかを見てみましょう。
多数のテクスチャ、特にスペキュラーテクスチャと拡散テクスチャについては均質であり、それでいて異なる解像度を必要とすることに注意してください。
例 1:このクレーンオブジェクトには 2 つのマテリアルが使われており、また、2 つの拡散テクスチャ、1 つのスペキュラースムースネステクスチャ、2 つのオクルージョンテクスチャ、2 つのディテールテクスチャが含まれています。
例 2:このシールドには 1 つのマテリアルが使われており、1 つの拡散テクスチャ、1 つのスペキュラースムーステクスチャ、1 つのオクルージョンテクスチャが含まれ、ディテールテクスチャはありません。
左:クレーンのインスペクターで両方のマテリアルを表示。右端がシールドのマテリアルを表す。
- アルベドテクスチャ:スペキュラワークフローでは、表面から跳ね返った拡散光の色を表します。左の画像(クレーン)で見られるように、必ずしも高度なディテールを必要とするわけではないのに対し、右のテクスチャ(シールド)ではかなりの独自のディテールが含まれています。
Painted Crane Diffuse Map スニペットは、無地の木の色と光の強度を持っています。控えめな量のディテールが含まれています。右の画像:解像度の高い(ppi)ユニークなディテールを持つシールドの拡散テクスチャ。
クレーンのマテリアルの Diffuse の値(テクスチャなし)
- スペキュラー:金属以外(絶縁体)は比較的暗い無彩色ですが、金属の値は明るく、色が着いている場合もあります(金属の錆、油、汚れはメタリックではないことを覚えておいてください)。木材表面のスペキュラーは、スペキュラーテクスチャの恩恵をそれほど受けられなかったため、マップを入力する代わりに特定の値を使用しました。
クレーンの木材部の Specular の値
クレーンの金属部分のスペキュラーマップ(メタリックシェーダーを使用していない)。右:シールドのスペキュラーテクスチャ。
- スムースネスは PBS マテリアルの重要な要素です。これは、サーフェスのバリエーション、不完全性、ディテールに寄与し、オブジェクトの状態や経年変化を表現するのに役立ちます。
クレーンの場合、スムースネスは表面全体でかなり一定であったため、値で代用することができました。これにより、適度なテクスチャメモリの節約ができました。
クレーンの木材部分の Smoothness の値。テクスチャは必要ありません。
クレーンの金属部分(メタリックシェーダー未使用)の Smoothness マップ。右:金属と木材が混在したシールドの Smoothness マップ。
- オクルージョンは、表面の異なる点が周囲の環境の光にどの程度さらされているかを示します。アンビエントオクルージョンは、間接光の少ないエリアの環境光とリフレクションをミュートすることで、表面のディテールと深度を導き出します。
シーンで SSAO(Screen Space Ambient Occlusion)を使用する選択肢もあることを覚えておいてください。SSAO と AO を使用すると、特定のエリアが二重に暗くされてしまうことがあります。このような場合は、AO マップをとして扱うことも考慮してください。.
SSAO やライトマップ付きのアンビエントオクルージョンを使用する場合は、深い亀裂やシワを強調する AO マップが最適です。
1:ライトマップ付き AO、2:オクルージョンテクスチャ、3:拡散光のオクルージョン、4:イメージエフェクト SSAO
セカンダリテクスチャと解像度
セカンダリテクスチャは、ディテールのレベルを上げたり、マテリアル内にバリエーションを持たせるために使用することができます。Detail Mask プロパティを使用してマスクすることができます。
クレーンの例では、一次拡散木質テクスチャの解像度が低いため、二次テクスチャセットは非常に重要です。これにより、最終的なサーフェスに細かいディテールが追加されます。この例では、ディテールマップはタイル状になっており、解像度はかなり低くなっています。これらは他の多くの木の表面で繰り返されるため、テクスチャのメモリを大幅に節約することができます。
セカンダリのアルベドマップと法線マップは、低解像度のメインの拡散マップと法線マップを補うものです。どちらのテクスチャも、村全体の木の表面に広く「オーバーレイ」され、タイル化されることで、全体的なテクスチャメモリを削減します。拡散ディテールマップにライティング情報を提供する場合は、メインの拡散マップにそのような情報を追加するのと同様の効果があるため、注意が必要です。
クレーンの木の表面。左:セカンダリテクスチャマップあり、右:セカンダリテクスチャマップなし。
これらのワークフローは、Viking Village プロジェクトのデザインに大いに役立ちました。これが皆さんにとって役立てば幸いです。また、皆さんからのコメントもお待ちしております。
謝辞
Viking Village プロジェクトは、HDR サーフェスキャプチャ技術および PBS 対応テクスチャを収録している Quixel Megascans ライブラリを開発している Quixel 社のクリエイティブチームとのパートナーシップにより開始されました。
このシーンに命を吹き込んでくれた Emmanuel "Manu" Tavares 氏と Plamen "Paco" Tamnev 氏に感謝します。
ぜひ、アセットストアでプロジェクトをダウンロードしてください。Unity 5.0.0 RC2 用に最適化されています。