パルテア

どうぶつの森の美術館 〜ゲームエンジン(Unity)グラフィックス ライティング ライトマップ UV の概要〜

一般に UV と呼ばれるテクスチャ座標は、ジオメトリの周囲にテクスチャを「巻き付ける」方法を記述します。ライトマップはテクスチャであるため、Unity がシーン内でライトマップを正しく使用するには UV が必要です。

ライトマップ UV の概要

リアルタイム グローバル イルミネーション システムとベイク グローバル イルミネーション システムはどちらもライトマップを使用するため、ライトマップ UV が必要です。

Unity は、リアルタイム グローバル イルミネーション システムとベイク処理されたグローバル イルミネーション システムに別個のライトマップ UV セットを使用します。これには 2 つの理由があります。

•リアルタイム ライトマップとベイクされたライトマップの間のインスタンスのグループ化には直接的な対応関係はありません。同じリアルタイム ライトマップ内にあるインスタンスが 2 つの異なるベイク ライトマップ内にある場合もあり、その逆も同様です。

•異なるスケールで表示されるメッシュは、ベイク処理されたライトマップではライトマップ UV を共有しますが、リアルタイム ライトマップでは UV を共有しません。

ベイク処理されたライトマップ UV

ベイク処理されたライトマップ UV はメッシュごとです。同じメッシュのすべてのインスタンスは、同じベイク処理されたライトマップ UV を共有します。 Unity は、モデルをインポートするときにベイクしたライトマップの UV を計算することも、独自のデータを提供することもできます。

Unity は、ベイクしたライトマップ UV を Mesh.uv2 チャネルのメッシュに保存します。このチャネルは TEXCOORD1 シェーダ セマンティクスにマップされ、一般に「UV1」と呼ばれます。

ベイク処理されたグローバル イルミネーションが有効で、特定の MeshRenderer がライトマップからグローバル イルミネーションを受け取る場合、Unity は Mesh.uv2 チャネルのデータを使用して、ベイク処理されたライトマップをメッシュに正しくマッピングします。

注: 特定のメッシュで別の目的で Mesh.uv2 を使用する場合は、そのメッシュを使用するすべての MeshRenderer コンポーネントがライト プローブからグローバル イルミネーションを受け取ることを確認する必要があります。
ライトマップではなく。これは、Mesh Renderer コンポーネント インスペクター、または MeshRenderer.receiveGI API を使用して変更します。

詳細については、「ライトマップ UV の生成」を参照してください。

リアルタイム ライトマップ UV

リアルタイム ライトマップ UV はメッシュ レンダラーごとです。同じメッシュのすべてのインスタンスは同じ入力データを共有しますが、メッシュ レンダラーの異なるインスタンスは実行時に異なるリアルタイム ライトマップ UV を使用できます。 Unity は、事前計算段階でリアルタイム グローバル イルミネーション システムの UV を計算します。この計算では、メッシュごとの UV を入力として受け取り、そのデータを使用してメッシュごとのレンダラー UV を作成します。 Unity は、モデルをインポートするときに入力メッシュごとの UV を生成することも、独自のデータを提供することもできます。

これは次のように機能します。

Unity は、Mesh.uv3 チャネルのデータをリアルタイム ライトマップ UV 計算の入力として使用できます。 Mesh.uv3 は TEXCOORD2 シェーダ セマンティクスにマップされ、一般に「UV2」と呼ばれます。
Mesh.uv3 にデータがなく、 Mesh.uv2 にデータがある場合、Unity はリアルタイム ライトマップ UV 計算の入力として Mesh.uv2 のデータを使用するように戻ります。 Mesh.uv2 は、ベイク処理されたライトマップ UV に使用されます。ベイク処理されたライトマップ UV をリアルタイム ライトマップ UV の入力データとして使用するのが一般的です。
計算の結果は、MeshRenderer ごとに MeshRenderer.enlightenVertexStream に保存されます。リアルタイム グローバル イルミネーションが有効で、特定の MeshRenderer コンポーネントがグローバル イルミネーションに寄与し、そのグローバル イルミネーションをライトマップから受け取る場合、Unity は Mesh.uv3 のデータではなく、MeshRenderer.enlightenVertexStream のデータをシェーダーの TEXCOORD2 に自動的に渡します。
注: リアルタイム グローバル イルミネーションを使用するメッシュで別の目的で Mesh.uv3 を使用する場合は、メッシュを使用するすべての MeshRenderer コンポーネントがライトマップではなくライト プローブからグローバル イルミネーションを受け取るようにする必要があります。これは、Mesh Renderer コンポーネント インスペクター、または MeshRenderer.receiveGI API を使用して変更します。

詳細については、「ライトマップ UV の生成」を参照してください。

Unity がリアルタイム ライトマップ UV を計算する方法

これは、Unity がメッシュごとの入力 UV を取得し、それをメッシュごとのレンダラー出力 UV に処理するときに起こります。

パッキング

Unity はリアルタイム ライトマップ UV を再パックして、各チャートの境界が全方向のテクセルの中心に位置することを確認し、各チャートの境界の周囲にハーフテクセルのパディングを追加します。これにより、すべてのチャート間に完全なテクセルのスペースが確保されます。

これは、リアルタイムでの更新を可能にするために、リアルタイム ライトマップの解像度が意図的に低くされているためです。これらのライトマップは低周波の間接照明のみを保存するため、解像度が低くてもグラフィック品質には影響しませんが、チャートがテクセルを共有する場合ににじみが発生する可能性があります。再パックすると、チャートがテクセルを共有することがなくなります。これにより、この問題が回避され、Unity がチャートを隣り合わせて効率的にパックできるようになります。


注: このパッキング手法は、計算された UV がインスタンスのスケールとライトマップ解像度に依存することを意味します。そのため、リアルタイム ライトマップ UV はメッシュ レンダラーごとに作成されます。ただし、Unity は可能な限りこれを自動的に最適化し、同じスケールとライトマップ解像度で同じメッシュを使用するメッシュ レンダラーは同じ UV を共有します。

結合

オプションで、このプロセス中に可能な場合は UV チャートをマージするように Unity に指示できます。これにより、ライトマップのサイズが削減され、実行時のメモリ使用量とパフォーマンスが向上します。

メッシュ レンダラー コンポーネントを使用すると、任意のゲームオブジェクトでこの最適化を有効にすることができます。メッシュ レンダラー インスペクターで、ライトマッピング セクションに移動し、リアルタイム UV を最適化します。

注: この機能では、元の UV マッピングの不連続性について間違いが発生することがあります。たとえば、意図的に鋭利なエッジが連続した表面として誤って解釈される可能性があります。このような場合は、この機能を無効にしてください。


    Course

  • 日時:2024/04/01 ~ 2025/03/31
  • 名称:どうぶつの森の美術館 〜ゲームエンジン(Unity)グラフィックス ライティング ライトマップ UV の概要〜
  • 場所:オンラインスクール
  • 料金:¥0 (消費税込)