静的オブジェクトのライティング

Tutorial

intermediate

+0XP

30 mins

Unity Technologies

静的オブジェクトのライティング

このチュートリアルでは、静的オブジェクトのライティングの重要性と、ライトマップおよびグローバルイルミネーションの応用について説明します。

1. 概要

モバイル端末向けアプリケーションを開発する際は、静的ライティングを使用することが非常に重要です。静的ライティングはモバイル端末上でも高速に処理できるため、ユーザーエクスペリエンスの向上につながります。動かないオブジェクトの静的ライティングの情報は、ベイクというプロセスによって保存できます。Unity はランタイムの前のこのプロセス中にライティングの計算を実行し、結果を保存します。

一方、動的ライティングやリアルタイムライティングなどの非静的ライティングは、フレームごとに計算、更新されます。シーンがドラマチックになり、没入感が高まりますが、コストは非常に大きくなります。そのため、非静的ライティングを使用する際は、目標とする美観とパフォーマンスのバランスをとることを常に心がけるようにしてください。

2. ライトマップとグローバルイルミネーション

ベイクでは、ライティング効果に関する情報が保存されるライトマップというテクスチャが別途生成されます。この情報はキャッシュされるため、ランタイム時に余分なパフォーマンスコストが発生しません。モバイルプラットフォーム向けのビルドを行う際は、できる限りライトマップへのベイクを行う必要があります。

事前にベイクされたライティングは、シーン内の動的要素に関与することがありません。しかし、ベイクしたライティングには、シーン内のすべての静的要素のグローバルイルミネーションが含まれるので、各静的要素は間接的な反射光を発したり受けたりすることはできます。これにより、ライティングがよりリアルになります。

次の画像は、完全にベイクされたシーンです。

Unity では、簡単にライトをベイクできます。事前に 2 つの手順を済ませる必要があります。

1.切り替えるライトコンポーネントを含むゲームオブジェクトをクリックします。「Mode」を「Mixed」または「Baked」に設定します。

モバイルプラットフォームの場合は、可能であれば、「Mixed」ではなく「Baked」を選択します。「Baked」は最もコストが低いオプションであるためです。

2.ベイクしたライトを受けるゲームオブジェクトに「Static」のマークを付けます。

オブジェクトにマークできる静的フラグは複数ありますが、設定で「Everything」を選択するのが一般的です。オブジェクトに「Static」のマークを付けると、Unity がそれを認識し、そのオブジェクトがベイクプロセスに含まれます。

注:「Batching Static」が有効になっているオブジェクトの場合は、動かしたりアニメーション化させたりすることはできません。これは別の最適化方法であり、可能ならそのままにしておきます)

ライトをベイクする際は、ベイクを開始したときにアクティブだったシーンに基づいてデータが保存されることを覚えておいてください。アクティブなシーンと同じ名前のフォルダーが生成されます。このフォルダーに、ベイクしたライティングのコンポーネントとデータがすべて保管されます。プロジェクトに、まとめてロードされる複数のシーンがある場合は、それぞれのシーンでライトを個別にベイクする必要があります。シーン内のライティングやオブジェクトに調整を加える場合は、変更を反映するため、ライトを再度ベイクする必要があります。次の画像は、メインのシーンのライティングデータを保持するフォルダーの例を示しています。

3. ライトマップの最適化

ベイク対象のライトを設定したら、ベイクしたライトマップの最適化も行う必要があります。

ライトマップは、ライトマップがベイクする対象の設定に応じてサイズが変動します。モバイルプラットフォームではメモリ使用率を極力最小化することがベストと言えます。そのため、ライトマップのサイズについては特に注意してください。次の例の画像では、1024x1024 ピクセルのライトマップが 7 つあることがわかります。

マップのプレビューでは、そのメッシュがわかります(選択したメッシュが強調表示されます)。

Lightmapping Settings」(「Windows」>「Rendering」>「Lighting Settings」)の以下オプションと、実際のマップのサイズによって、メモリ使用量が決まります。

4. ライトマッパー

Unity のライトマッパーには、3 種類の方法でシーンにライトをベイクできます。

  • Enlighten(Unity 2019 LTS で廃止されましたが、引き続き利用可能です)
  • プログレッシブ CPU
  • プログレッシブ GPU

次の画像にこれらのオプションが示されています。

どのようなプロジェクトでも、いずれかのプログレッシブオプションを使用する必要があります。プログレッシブライトマッパーでは、ライトマップが段階的に作成されるため、時間を節約できます。「Prioritize View」を選択した場合は、シーンビュー内の領域が優先されます。「Prioritize View」では、シーンのライティングを設定する際に反復処理が高速化されます。

CPU と GPU のプログレッシブライトマッパーの主な違いは、ライトマップが CPU によって生成されるのか、GPU によって生成されるのかです。結果は同じですが、高性能 GPU を使用している場合は、プログレッシブ GPU の方が大幅に高速化されます。GPU オプションに関するその他の要件や設定については、こちらで確認できます。

5. テクセル

テクセルは「texture element(テクスチャ要素)」の略語("tex"ture と"el"ement)であり、テクスチャマップ内の個々のピクセルを指します。テクセルは、ライトマップ内でオブジェクトにライトが当たる各ポイントで、ライティング情報を保管します。テクセル数を確認することで、ライトのベイクに必要な処理の量を測定できます。テクセルとは何なのか、テクセルによってライティングの品質、ベイクの計算時間、ディスクストレージや VRAM のコストにどのような影響が生じるのか、といった点を理解することが重要です。

必要なライトマップデータの量を最小化しようとする場合は、「Lightmapping Settings」で、ベイクの各ユニットのテクセル数を調整する必要があります。例の画像のように、この設定によって、ベイク時に各オブジェクトで使用するテクセル数など、ライトマップを管理します。

「Lightmapping Settings」には、「Lightmap Resolution」というオプションも含まれています。このオプションによって、ライトマップ内の各ユニットで使用されるテクセル数を指定します。

シーン内のテクセルの配置を確認する方法は次のとおりです。

  • シーンビューの左上にある「Shading Mode」ドロップダウンからクリックします。
  • Lightmap Indices」を確認してクリックします。

これで、ベイクされたオブジェクトはチェッカーボードのオーバーレイで覆われるようになります。これが、ライトをベイクしたときにテクセルを分散させる方法です。

次のスクリーンショットは、さまざまな「Lightmap Resolution」設定でのキューブです。画像の左側は設定が 1、真ん中が 2、右側が 5 です。

解像度が高くなると、必要な処理が増えるのがわかります。最初は「Lightmap Resolution」を低め(5~10)に設定し、シーンでの必要性に応じて上下させると良いでしょう。「Lightmap Resolution」を引き上げると、それぞれが反復処理を行うためサイズが大幅に増大する状態を引き起こします。

例としては、以下のスクリーンショットのように、「Lightmap Resolution」を 15 から 12 に下げてみた場合、必要なライトマップの数が 7 から 4 に減少します。

6. テクセル使用量

「Lightmapping Settings」でシーン内のテクセル数を設定できますが、テクセル数を減らしたいオブジェクトもあります。

Unity では、各オブジェクトで使用できるテクセル数を管理できます。オブジェクトの「Mesh Renderer」(「Inspector」>「Mesh Renderer」)に移動すると、「Scale In Lightmap」というパラメーターがあります。この設定を調整することで、ライトマップでオブジェクトが使用できるテクセル数を変更できます。

次のスクリーンショットの左側のものは、それぞれベイクするユニットのライティング情報で 5 テクセルを取得した場合での平均的なオブジェクトです。「Lightmap Resolution」が 5 に設定されているためです。右側は、「Scale In Lightmap」が 0.5 に設定されているボックスです。

右側のボックスは、ライトマップで使用するスペースが左側のボックスよりもかなり小さくなります。次のスクリーンショットでは、「Mesh Renderer」コンポーネントで利用できるライトマップの設定を見ることができます。

次の要素では、なるべくテクセルを使用しないでください。

  • ユーザーからは見えることがないサーフェスとオブジェクト。これにより、比較的大きなライトマップで、画面に表示されないディテールによってメモリの無駄が生じるのを防ぐことができます。
  • ライトの変化がごくわずかなサーフェス。影に覆われているオブジェクトや、1 つのライトが当たるオブジェクトなど。
  • 小さいオブジェクトや薄いオブジェクト。小さいオブジェクトや薄いオブジェクトが受けるライティングの量は、シーンの最終的なレンダリングにはあまり影響しません。

7. LOD とライトマップ

モデルで詳細レベル(LOD)を使用すると、ベイクしたライティングに影響します。LOD グループ内の最も詳細レベルが高いモデルのみ、静的オブジェクトのようにライティングされ、同グループ内の他のモデルは動的にライティングされます。直接光と間接光、リアルタイムグローバルイルミネーションには、別のライトマップが使用されます。

Enlighten のライトマッパーを使用する場合は、システムによって直接光のみがベイクされます。間接光をサンプリングするためには、シーン内でライトプローブを使用する必要があります。

次の画像は LOD モデルの例です。最初の画像の LOD が 0 のモデルのみ、適切にライティングされています。これは、ライトプローブがシーンに配置されていないためです。2 つ目の画像は、LOD を使用するモデルの例です。ライトプローブによって、適切にライティングされています。

LOD モデルがベイクしたライティングを適切に受けられるようにするためには、「Static」チェックボックスの横にあるドロップダウンメニューで、LOD ゲームオブジェクトに「Contribute GI」というマークを付ける必要があります。

8. まとめ

3D アートの最適化では、ライトマップを使用して静的オブジェクトのライティングデータを格納しておくことが不可欠です。次のチュートリアルでは、動くオブジェクトや LOD を設定したオブジェクトに対して、よりリアルなベイクしたライティング条件を実現するうえで、ライトプローブがどのように役立つのかを説明します。

Complete this Tutorial