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