This is the documentation for Enlighten.

7.1. 出力形式


Enlighten は、複数の形式でライトマップとキューブマップのイラディアンス出力のエンコードをサポートしています。これらの形式のほとんどは GPU でネイティブにサポートされており、圧縮形式でイラディアンス出力テクスチャを表す作業に適しています。出力形式は、Enlighten::eOutputFormat 列挙体のメンバーで表されます。

ライトマップ イラディアンス テクスチャとキューブマップの出力形式は、UpdateManagerPropertiesm_IrradianceOutputFormatm_CubemapOutputFormat フィールドを使用して設定します。以下に例を示します。

Enlighten::UpdateManagerProperties properties;
properties.m_IrradianceOutputFormat = Enlighten::OUTPUT_FORMAT_R11G11B10;
properties.m_CubemapOutputFormat = Enlighten::OUTPUT_FORMAT_R11G11B10;

出力形式

Enlighten は、以下の形式をサポートします。

出力形式

説明

同等の DXGI 形式

OUTPUT_FORMAT_FP16

各ピクセルのチャンネルあたり 16 ビットの浮動小数点 (ピクセルあたり 8 バイト)

DXGI_FORMAT_R16G16B16A16_FLOAT

OUTPUT_FORMAT_LRB

16 ビット固定小数点の輝度、8 ビットの赤、青 (ピクセルあたり 4 バイト)詳細は以下をご覧ください。

DXGI_FORMAT_R8G8B8A8_UNORM

OUTPUT_FORMAT_R11G11B10

浮動小数点、チャネルあたり 11 ビットの R と G、10 ビットのB

DXGI_FORMAT_R11G11B10_FLOAT

OUTPUT_FORMAT_R9G9B9E5

浮動小数点、チャネルあたり 9 ビットの仮数部と共有の 5 ビットの共有指数部

DXGI_FORMAT_R9G9B9E5_SHAREDEXP

OUTPUT_FORMAT_RGBM

8 ビット固定小数点、赤、緑、青、および 8 ビットの乗数。このセクションの後半の 932970595 をご覧ください。

DXGI_FORMAT_R8G8B8A8_UNORM

選択した OUTPUT_FORMAT 列挙子と一致する形式でGPU テクスチャを作成する限り、特別なシェーダー コードは必要ありません。テクスチャをサンプリングしてイラディアンス値を取得するだけです。LRB と RGBM 形式の場合、追加のデコード用コードが必要です。それぞれ 932970595 と 932970595 をご覧ください。

ターゲット プラットフォームがサポートしている場合、R11G11B10 のイラディアンス エンコードを使用すると HDR ライティングのコストと品質のバランスがとれます。

LRB

LRB 形式 (輝度、赤、青) では、輝度 (明るさ) は 16 ビットを使用して格納され、正規化された赤と青はそれぞれ 8 ビットを使用して格納されます。固定小数点形式であるため、エンコードする範囲を選択する必要があります。ソルバー自体は輝度値を [0,1] でエンコードします。ほとんどの場合、これよりも広い範囲を (より低い忠実度で) 表す必要があると考えられます。従って、ソルバーでラジオシティを下げる係数が適用されるよう指定し、その後シェーダーで逆スケーリングを適用します。GeoRadiosity でこの出力形式を使用する場合、輝度に [0,16] の範囲を使用し、HDR レンダリングの余裕を持たせます。

radIrradianceTask.m_OutputFormat = Enlighten::OUTPUT_FORMAT_LRB; // LRB 形式の出力値 
 
radIrradianceTask.m_OutputScale = 1.0f / 16.0f; // 輝度値を [0,16] でエンコードするように選択 ([0,1] にスケールダウン)

まず、輝度 L = R + G + B を計算し、次にスケーリングされた赤 R' = R/L とスケーリングされた青 B' = B/L を計算します。これらは追加のスケーリングが必要ないよう [0,1] に収まっている必要があります。LRB データは 8 ビット RGBA 符号なし整数形式で格納されます。 

  • アルファ コンポーネント: 16 ビット輝度値の下位 8 ビットです。
  • 赤コンポーネント: 16 ビット輝度値の上位 8 ビットです。
  • 緑コンポーネント: スケーリングされた赤です。
  • 青コンポーネント: スケーリングされた青です。

したがって、シェーダーで必要なデコードは以下のとおりです。

float4 rawValue = tex2D(g_IrradianceSampler, uv);
 
// LRB 値をデコード
float3 colour     = float3(rawValue.g, 1.0f - rawValue.g - rawValue.b, rawValsue.b);
float intensity   = (rawValue.r + rawValue.a / 256.0f) * 16.0f; // 選んだ GeoRadiosity 範囲 [0,16] を使用
float3 irradiance = colour * intensity;

RGBM

OUTPUT_FORMAT_RGBM 形式は出力のアルファ チャネルを R、G、および B の最大値に設定し、出力 R、G、および B をこの最大値の割合として格納します。これは、以下のようにシェーダーで簡単にデコードできます。

float4 rgbmEncoded = tex2d(sampler, uv);
float3 decoded = float3(rgbmEncoded.xyz * rgbmEncoded.a);

先ほど詳しく説明した LRB のエンコードと似ており、ソルバーは値を [0,1] でエンコードします。より広い範囲を表したい場合は、radIrradianceTask.m_OutputScale にダウンスケール係数を与え、シェーダーで逆スケーリングを実施します。