Unity は、ターゲットプラットフォームやライティングウィンドウの圧縮設定によって、異なる圧縮やエンコードスキームでライトマップを格納します。
Unity プロジェクトでは必要に応じて、2 つのテクニックを使ってベイクしたライトの強度範囲を低ダイナミックレンジのテクスチャにエンコードできます。
RGBM エンコード。 RGBM エンコードは、RGB チャンネルにカラーを、アルファチャンネルに乗数 (M) を保存します。 RGBM ライトマップの範囲は、リニア空間では 0〜34.49 (52.2)、ガンマ空間では 0〜5 です。
ダブルローダイナミックレンジ (dLDR) エンコーディング。 dLDR エンコードは、[0、2] の範囲を [0、1] に単純にマッピングすることによって、モバイルプラットフォーム上で使用されます。 2 の値を上回る焼成された光強度がクランプされる。デコード値は、ガンマ空間を使用する場合はライトマップテクスチャの値に 2 を掛けて計算し、リニア空間を使用する場合は 4.59482 (22.2) を掛けて計算します。プラットフォームの中には、ライトマップを dLDR として保存するものもあります。なぜなら、RGBM を使用するとハードウェア圧縮によって 見ためを悪くするアーティファクトが生成される場合があるからです。
リニアカラースペースを使用すると、ライトマップテクスチャは sRGB とマークされ、シェーダーが使用する最終値 (サンプリングおよびデコード後) はリニア色空間になります。ガンマ色空間を使用する場合、最終値はガンマ色空間になります。
注意: エンコードを使用すると、ライトマップ (GPU テクスチャメモリ) に格納された値は常にガンマ色空間になります。
UnityCG.cginc シェーダーのインクルードファイルの Decode Lightmap シェーダー関数は、値がシェーダーのライトマップテクスチャから読み取られた後のライトマップ値のデコードを処理します。
HDR ライトマップはスタンドアロン (PC、Mac、Linux)、Xbox One、PlayStation4、iOS、tvOS、Android で使用できます。Player 設定の Other Settings には、これらのプラットフォーム向けに Lightmap Encoding があり、エンコード/圧縮を制御します。
High Quality を選択すると、HDR ライトマップサポートを使用しますが、Normal Quality では RGBM エンコードを使うように切り替えます。Low Quality では、モバイルプラットフォームに対して、dLDR エンコードに切り替えます。他のプラットフォームに対しては、Normal Quality と同様です。
Lighting ウィンドウでライトマップの Compression を有効にすると、デスクトップとコンソールのプラットフォームで BC6H 圧縮形式を使用してライトマップが圧縮されます。モバイルプラットフォームの場合、Unity は下の表に従って HDR (High Dynamic Range、ハイダイナミックレンジ) 形式を選択します。
HDR ライトマップは、ライトマップ値をエンコードするためにエンコードスキームを使用しないため、サポート範囲は、0 〜 65504 の16 ビット浮動小数点テクスチャ形式によって制限されるだけです。
BC6H 形式の品質は、DXT5 + RGBM 形式のエンコードよりも優れており、RGBM エンコードに発生するカラーバンディングによるアーティファクトを生成しません。
HDR ライトマップをサンプリングする必要があるシェーダーは、サンプリングされた値をデコードする必要がないため、ALU の命令がいくらか短くなります。
BC6H 形式は、DXT5 と同じ GPU メモリ要件です。
ターゲットプラットフォームごとのエンコードスキームとそのテクスチャ圧縮形式のリストは以下の通りです。
ターゲットプラットフォーム | エンコード | 圧縮 - サイズ (ビットごとのピクセル) |
---|---|---|
スタンドアロン (PC, Mac, Linux) | RGBM / HDR | DXT5 / BC6H - 8 bpp |
Xbox One | RGBM / HDR | DXT5 / BC6H - 8 bpp |
PlayStation4 | RGBM / HDR | DXT5 / BC6H - 8 bpp |
WebGL 1.0 / 2.0 | RGBM | DXT5 - 8 bpp |
iOS | dLDR / RGBM / HDR | PVRTC RGB - 4 bpp / ETC2 RGBA - 8 bpp / RGB9E5 - 32 bpp |
tvOS | dLDR / RGBM / HDR | ASTC - 3.56 bpp / ASTC - 3.56 bpp / RGB9E5 - 32 bpp |
Android* | dLDR / RGBM / HDR | ETC1 RGB - 4 bpp / ETC2 RGBA - 8 bpp / ASTC HDR - 3.56 bpp |
GI システムへの入力の範囲とエンコードは出力と異なります。表面アルベドは、ガンマ空間で 8 ビット符号なし整数型の RGB であり、放射はリニア空間で 16 ビット浮動小数点型の RGB です。メタパスを使用してカスタム入力を行う方法については、 メタパス のドキュメントを参照してください。
放射の出力テクスチャは、RGB9E5 共有指数の浮動小数点型 (グラフィックハードウェアがサポートする場合)、またはフォールバックとしては 範囲が 5 の RGBM を使用して保存されます。 RGB9E5 ライトマップの範囲は [0, 65408] です。RGB9E5 形式の詳細については、 Khronos.org: EXT_texture_shared_exponent を参照してください。
関連項目
2019–04–26 編集レビュー 無しに修正されたページ - ページのフィードバックを残す
ベイクしたライトマップは Unity 2017.2 で追加NewIn20172
HDR ライトマップサポートは Unity 2017.3 で追加NewIn20173
モバイルプラットフォーム用のライトマップエンコード設定は、Unity 2019.1 で追加NewIn20191