This is the documentation for Enlighten.
7.1. 出力形式
Enlighten は、複数の形式でライトマップとキューブマップのイラディアンス出力のエンコードをサポートしています。これらの形式のほとんどは GPU でネイティブにサポートされており、圧縮形式でイラディアンス出力テクスチャを表す作業に適しています。出力形式は、Enlighten::eOutputFormat 列挙体のメンバーで表されます。
ライトマップ イラディアンス テクスチャとキューブマップの出力形式は、UpdateManagerProperties
の m_IrradianceOutputFormat
と m_CubemapOutputFormat
フィールドを使用して設定します。以下に例を示します。
Enlighten::UpdateManagerProperties properties; properties.m_IrradianceOutputFormat = Enlighten::OUTPUT_FORMAT_R11G11B10; properties.m_CubemapOutputFormat = Enlighten::OUTPUT_FORMAT_R11G11B10;
出力形式
Enlighten は、以下の形式をサポートします。
出力形式 | 説明 | 同等の DXGI 形式 |
---|---|---|
| 各ピクセルのチャンネルあたり 16 ビットの浮動小数点 (ピクセルあたり 8 バイト) |
|
| 16 ビット固定小数点の輝度、8 ビットの赤、青 (ピクセルあたり 4 バイト)詳細は以下をご覧ください。 |
|
| 浮動小数点、チャネルあたり 11 ビットの R と G、10 ビットのB |
|
| 浮動小数点、チャネルあたり 9 ビットの仮数部と共有の 5 ビットの共有指数部 |
|
| 8 ビット固定小数点、赤、緑、青、および 8 ビットの乗数。このセクションの後半の 932970595 をご覧ください。 |
|
選択した 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 にダウンスケール係数を与え、シェーダーで逆スケーリングを実施します。