👋

【Unity】Adaptive Probe Volumesと他ライティング手法のルック比較

に公開

はじめに

こんにちは、クライアントエンジニアのサックーです。
この記事では、 Adaptive Probe Volumes(以下 APV )と他ライティング手法のルック比較をしていきます。 あくまでルックの比較をするのみで、どれが優れているといった議論はしませんのでご了承ください。 メモリ使用量やランタイムでの負荷については、次回記事にて記載予定です。
具体的に比較するのは以下になります。

  • Adaptive Probe Volume
  • Lightmap
  • Realtime Light
  • Bakery で Light Map
  • Bakery で Adaptive Probe Volume

APV とは簡単に言うと従来の Light Probe の進化系で、場合によっては LightMap へのベイクを置き換えることも可能なクオリティのライティングを提供できるようになったものになります。

なお APV 本体の紹介については割愛しますので、以下のようなソースを参考にしてください。

https://tarowork.hatenablog.jp/entry/2024/12/05/000000

https://www.youtube.com/watch?v=IpVuIZYFRg4

12 月 1 日の記事で、APV でできるライティング状態のブレンドについて紹介しています。
今回の記事でもこの時のプロジェクトを流用する上、重複する説明は省きますので適宜参照していただければと思います。

https://zenn.dev/ambr_inc/articles/b7a92d863203e8

また、本記事における環境は以下の通りです。

  • Unity 6000.0.58f2
  • Universal Render Pipeline 17.0.4

さらにシーンについては以下の無料アセットを使用しています。

https://assetstore.unity.com/packages/3d/environments/urban/colonial-city-littlepack-church-graveyard-environment-163089

プロジェクトおよびシーンのセットアップ

基本的に前回記事のものを流用しますが、検証項目ごとに必要な作業していきます。

簡単に説明すると、上記アセットのサンプルシーンに PointLight を 10 個設置したものになります。
今回はそのライトの色を全部バラバラに設定しなおしました。

Adaptive Probe Volume

上記セットアップをした後にGenerate Lightingしたものが以下になります。
手順については前回記事を参照してください。

Lightmap

Hierarchy でt:meshrendererで検索し、すべての MeshRenderer のReceive Global IlluminationLightmapsに変更します。

さらに前回置いた APV も削除してしまいます。
そうしてから Light タブで Generate Lighting を実行します。

その結果得られたルックはこちらになります。

APV と比較すると明確な が現れていて、より明瞭なライティング結果となっていると思います。
しかし裏側から見て見ると以下のようにベイクエラーが発生してしまっていました。

これは Lightmap 用の UV が用意できていなかったためですね。
ひとまず全モデルの ImportSettings からGenerate Lightmap UVsにチェックを入れてみましょう。

その後ベイクしなおした結果が以下です。


裏側も正しくベイクができました。
今回は Unity 機能のみで修正できましたが、3D モデルによってはうまく行かないこともあります。
これは既存 Assest を購入するなどして使用する際に Lightmap の弱点となりうる点だと思います。

Realtime Light

次は Realtime Light ですが、手間を省いて Light タブから Generate Lighting 横の下三角を押してClear Baked Dataを押してベイクデータを削除してしまいます。
その結果得られたルックは以下となります。

main light 以外の 間接光が反映されない ため、PointLight 周辺のライティングが単調になってしまっているように見えます。また影の形もギザギザしたものになってしまっています。

ここで、今使っているUniversal Render Pipline AssetAdditional Lightsの項目を変更してみましょう。
上記はPer Vertexの状態でしたが、Per Pixelにしてみます。これは追加ライトの処理単位の設定になります。

すると以下のように PointLight 達の影が正しく描画されるようになりました。

Per PixelPer Vertexと比較して負荷が高いとされていますが、その分正確な描画が行われるようです。

Bakery で Lightmap

ライトベイク用アセットで一番有名な Bakery とも比較していきます。
全ライトに対応する Bakery コンポーネントを付け、プロパティを一致させます。

そして Bakery のタブからTexels per unitを Unity 標準ベイクとそろえるために 10 にしてから Render を押します。

結果得られたのは以下です。

Unity 標準のベイクと比べて影の色が濃く、輪郭の解像度が上がっているように見えますね。

Bakery で APV

実は Bakery のライトコンポーネントを使っていても APV を使用できます。
Bakery タブの Settings mode をExperimentalにすると下部にRender Adaptive Volumesボタンが現れるのでそれを使います。

その結果得られた画は以下です。

標準ライトによるものと比較すると、全体的に彩度や光量が上がっているように見えます。

全比較

ここで改めて全ての結果の画像を貼ります。


APV


Lightmap


Realtime Light


Realtime Light (Per Pixel)


Bakery Lightmap


Bakery APV

おわりに

今回は Unity URP において代表的なライティング手法ごとのルック比較をしました。
どういった時にどれを使えばいいのか、それぞれの長所短所をランタイムの負荷などを含めて議論する記事を来週公開予定ですので、よろしければ見ていただけると幸いです。

ambr Tech Blog

Discussion