Unity Pro Tips

ARTIST詳細

プログレッシブライトマッパーの最適化に役立つ8つのヒント

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

Unityのライティングシステムに関する予備知識がある開発者やライティングアーティストに向けて、プログレッシブライトマッパーを使ったライティング結果の最適化に役立つ手法として、Unity のライトマッピングの最新情報、パラメーターの最適化、テクセルの効率的な使用、テクセル数の指定、テクセルが不要な場所、シャドウのベイク、ライトプローブの使用、フィルタリング設定のコツ、Lightmap Padding パラメーターの勘所について、Unity のグラフィックスプログラマーである Kuba Cupisz と Tobias Alexander Frankeが具体的に解説します。 ライティングの勉強はこれからという方にも分かりやすい内容で構成していますので、ぜひお読みください。

Unity のライトマッピングの最新情報

(CPU)プログレッシブライトマッパーは、高速なパストレーシングベースのライトマッパーシステムです。これにより、ベイクしたライトマップとライトプローブがエディター内で段階的に更新されます。ライトマップの出力は利用可能になるとすぐに取得できます。たとえ不完全なものであったとしても、シーンがどのように表示されるかを大まかに把握できます。

ライトマッピングの次のメジャーアップデートは GPU ライトマッパーです。この機能は Unity 2018.3 でプレビュー版の機能として公開されています(そのため、本格的な運用には使用しないでください)。GPU ライトマッパーの目的は、CPU プログレッシブライトマッパーと同じ機能セットを、より高いパフォーマンスで提供することです。詳細は GPU ライトマッパーフォーラムを参照してください。

CPU ライトマッパーと GPU ライトマッパーの最新情報については、2018.3 ブログ記事をご覧ください。

プログレッシブライトマッパーのパラメーター:最適化

Unity プログレッシブライトマッパーのパラメーター

Prioritize View:これを有効にすると、プログレッシブライトマッパーは、現在 Scene ビューに表示されているテクセルへ変更を適用した後、Scene ビュー外部のテクセルに変更を適用します。

Direct Samples:各テクセルから放たれるサンプル(パス)数。この設定により、プログレッシブライトマッパーが直接光の計算に計上するサンプルの数を制御します。この値を大きくすることでライトマップの品質を改善できますが、ベイキング時間が長くなってしまいます。

Indirect Samples:各テクセルから放たれるサンプル(パス)数。この設定により、プログレッシブライトマッパーが間接光の計算で計上するサンプルの数を制御します。一部のシーン(特に屋外のシーン)では、サンプル数は 100 で十分ですが、屋内のシーン(特に発光ジオメトリを使用している場合)では、より大きな値を指定する必要があります。サンプル数 512 くらいから始めて、最終結果のノイズが多すぎる場合にだけサンプル数を増やしてください。

Bounces:この値を使って、パス追跡中に行う間接反射回数を指定します。ほとんどのシーンでは、反射回数は 2 で十分です。一部の屋内のシーンでは、反射回数を増やすことが必要になる場合があります。

テクセルを効率的に使う

ライトマッピングは、基本的に、テクセルレベルでグローバルイルミネーションを計算するプロセスです。テクセルとは、ライティング情報の格納に使用されるピクセルのことで、任意のサーフェスにおいて、光が当たるそれぞれの位置がそれにあたります。テクセルの数とは、つまりライトマッパーでライトマップの計算に要する処理量を意味します。テクセルの効率的な使用が、ライトマップの最適化に役立つことになるのです。

テクセル数の指定

「Lightmapping Settings」には「Lightmap Resolution」というパラメーターがあります。このパラメーターを使用すると、ライトマップに使用する単位あたりのテクセル数を指定できます。簡単な例として、シーンに配置されたサイズが 1 x 1 x 1 の単位キューブがあります。「Lightmap Resolution」で定義したテクセル数が、この単位キューブの各辺に配置されます。

このテクセル数を大きくすると、2D テクスチャなので、テクセル数が 2 次元的に増えることを覚えておくことが大切です。例えば、数を 1 から 2 に増やした場合、テクセル数は 4 倍になります。

以下の例を見ると、左側では空間 1 単位に 1 テクセルがあります。1 単位あたりのテクセル数を 2 に増やすと、ライトマッパーの処理量は 4 倍になります。1 単位あたりのテクセル数を 5 に増やすと、処理量はいきなり 25 倍になります。

Unity プログレッシブライトマッパー最適化:テクセル数

テクセルが不要な場所

以下の場所ではテクセルを必要以上に使わないようにします。

  • 光の変化が少ないシーンのサーフェス。例えば、1 種類のライトで照らされているサーフェスや、そのようなライトの陰に入っているサーフェスが該当します。
  • 間接光のみを受けているサーフェス。拡散サーフェスで間接光が反射する頻度は直接光よりもかなり低いため、ライティング情報を格納する場合にもそれほど多くのテクセルは必要ありません。
  • 石など、シーン内に配置された小さなオブジェクト。
  • 電線などの細いオブジェクト。テクセルが狭いスペースに押し込められてしまうため、最終的なイメージの品質にほとんど結びつきません。
  • プレイヤーから見えないサーフェス。

テクセル数はインスタンスごとに減らすことができます。各オブジェクトのメッシュレンダラーには、「Scale in Lightmap」というパラメーターが用意されています。これは、ライティングウィンドウの解像度に適用される乗数です。

Unity プログレッシブライトマッパー最適化:テクセルを減らす

シャドウのベイクは不要

インスペクターの「Lighting」にある「Lighting Mode」プロパティーでは、Unity でシーン内のすべての混合ライトに使用するライティングモードを指定します。オプションには、「Baked Indirect」、「Distance Shadowmask」、「Shadowmask」、および「Subtractive」があります。

Unity プログレッシブライトマッパー最適化:ベイクしない

ライトプローブを使う

シーン内にある小さなオブジェクト(フェンス、電線、チューブ、小物などのテクセルをあまり必要としないオブジェクト)やサイズのわりに表面積が非常に大きいオブジェクト(特に樹木)を照らすには、ライトプローブを使用できます。

ライトマップがシーン内のサーフェスに当たるライトに関するライティング情報を保持するのに対し、ライトプローブはシーン内のスペースを通過するライトに関する情報を保持します。

主として、ライトプローブは、シーン内の動くオブジェクトに対して質の高いライティング(間接光を含む)を提供します。また、景観に Unity の LOD システムを使用する場合には静的な景観のライティング情報を提供します。

ライトプローブでは、ライトマップテクセルよりも少し多くの情報が格納されますが、あらゆる方向から来るライティングに関する情報はエンコードされます。あらゆる面から曲面を照らすには、1 つのプローブで十分です(複数のプローブ間の補間も、オブジェクトの位置を正しく表すために必要な値を提供します)。ライトマップを使用する場合は、さまざまな面に対応した複数のテクセルが必要になります。

Unity プログレッシブライトマッパー最適化:ライトプローブ

フィルタリング

「Filtering」パラメーターは通常、「Auto」に設定されており、ほとんどのシーンに対して適正な開始値が選択されます。

一方、「Advanced」モードの場合、3 つの異なるターゲット(直接光、間接光、アンビエントオクルージョン)に対して、個別にポストプロセスモードを呼び出すことができます。

フィルタリングポストプロセスには、ガウシアンフィルターと A-Trous フィルターの 2 つのバリアントがあります。

A-Trous フィルターの値ではシグマを定義するのに対し、ガウシアンフィルターの値では半径を定義します。このパラメーターは、フィルターがイメージの差分に作用する閾値を定めます。

ガウシアンフィルターはガウシアンブラーですが、A-Trous フィルターはエッジを認識します。違いは、ガウシアンフィルターはライトマップのコンテンツを認識しないため、単純にチャート内のあらゆるものをぼかします。その結果、オブジェクトの下の影が消え、オブジェクトが地面から浮かんでいるかのように見える可能性があります。一方、A-Trous フィルターは、エッジを認識するので、影のエッジの位置を検出し、エッジの保存を試みます。

Unity プログレッシブライトマッパー最適化:フィルター

Lightmap Padding パラメーター

知っておくべきもう 1 つのパラメーターが「Lightmap padding」です。このパラメーターを使用して、ベイクしたライトマップにおけるオブジェクトの間隔を(テクセル単位で)指定します。ただし、シーン内に小さなオブジェクトが無数にあり、テクセルが無駄に使われている可能性のある状況でこのパラメーターを使用すると、問題を引き起こす可能性があることに注意してください。

多数の UV アイランドの間にパディングを追加すると、さらに多くのスペースを浪費することになってしまいます。このスペースは、「Lightmap Size」を使用して制限することができます。

Unityニュース

Pro TipsなどUnityの最新情報、学習情報、お得な情報を受け取りたい方はこちら

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