High dynamic range lighting

はじめに

通常、アーティストはすべての3Dモデリングを行い、次にすべてのテクスチャリングを行い、3D DCCの見栄えの良いモデルを見て「良い出来だ、組込みの準備ができた!」と言います。その後、ゲームに組み込まれ、照明が設定され、ゲームが実行されます。

それでは、この”HDR”の事業はどの時点で実現するのでしょうか?答えを理解するために、ディスプレイがどのように動作するかを見る必要があります。

ディスプレイは、最大強度から最小強度までの直線的な比率の光を出力します。現代のゲームエンジンは、それぞれのシーンで直線的な光量に対して複雑な計算を実行します。では、何が問題なのでしょうか?

ディスプレイの種類に応じて、ディスプレイの輝度範囲は制限されています。ただし、ゲームエンジンは無制限の範囲の強度値にレンダリングします。 「最大輝度」はsRGBディスプレイにとって何かを意味しますが、ゲームエンジンには影響しません。レンダリングのフレームごとに生成される潜在的に無限に広い範囲の強度値のみがあります。

これは、scene-referred 光量比とも呼ばれるシーンの光強度の変換を、選択したディスプレイの特定の出力範囲内に収まるように変換およびマッピングする必要があることを意味します。これは、仮想カメラを通してゲームエンジンのシーンを仮想的に撮影することを検討する場合に最も簡単に理解できます。ここで、仮想カメラは特定のカメラレンダリングトランスフォームをシーンデータに適用し、出力は特定のディスプレイタイプで表示できる状態になります。

注釈

Godot does not support high dynamic range output yet. It can only perform lighting in HDR and tonemap the result to a low dynamic range image.

For advanced users, it is still possible to get a non-tonemapped image of the viewport with full HDR data, which can then be saved to an OpenEXR file.

コンピューターのディスプレイ

ほとんどすべてのディスプレイでは、送信されるコード値に非線形エンコードが必要です。次に、そのユニークな転送特性を使用して、コード値を出力の直線的な光量比に「デコード」し、赤、緑、青の各発光部からその値を投影します。

大多数のコンピューターディスプレイの場合、ディスプレイの仕様はIEC 61966-2-1(1996 sRGB仕様とも呼ばれます)に基づいて概説されています。 この仕様では、LEDピクセルのライトの色、入力(OETF)および出力(EOTF)の伝達特性など、sRGBディスプレイの動作の概要を説明します。

すべてのディスプレイがコンピューターディスプレイと同じOETFおよびEOTFを使用するわけではありません。たとえば、テレビ放送のディスプレイではBT.1886 EOTFが使用されます。ただし、現在GodotはsRGBディスプレイのみをサポートしています。

sRGB規格は、一般的なデスクトップコンピューター用CRTディスプレイの電流出力と光出力の間の非線形関係に基づいています。

../../_images/hdr_gamma.png

scene-referredモデルの数学では、シーンに異なる値を乗算して、強度と異なる照明範囲への露出を調整する必要があります。ディスプレイの伝達関数は、ディスプレイの単純な伝達関数を使用して、ゲームエンジンのシーン出力のより広いダイナミックレンジを適切にレンダリングできません。より複雑なエンコードのアプローチが必要です。

シーンリニアおよびアセットパイプライン

Working in scene-linear sRGB is not as simple as just pressing a switch. First, imported image assets must be converted to linear light ratios on import. Even when linearized, those assets may not be perfectly well-suited for use as textures, depending on how they were generated.

これを行うには、次の 2 つの方法があります:

画像インポート時に線形比を表示するsRGB伝達関数

これはsRGBアセットを使用する最も簡単な方法ですが、最も理想的な方法ではありません。これに関する1つの問題は、品質の低下です。チャネルごとに8ビットを使用して直線的な光量比を表すだけでは、値を正しく量子化するには不十分です。これらのテクスチャは後で圧縮されることもあり、問題を悪化させる可能性があります。

直線化変換を表示するハードウェアsRGB伝達関数

The GPU will do the conversion after reading the texel using floating-point. This works fine on PC and consoles, but most mobile devices don't support it, or they don't support it on compressed texture formats (iOS for example).

Scene linear to display-referred nonlinear

すべてのレンダリングが完了した後、シーンのリニアレンダリングは、sRGBディスプレイなどの適切な出力に変換する必要があります。 これを行うには、現在の Environment でsRGB変換を有効にします(詳細は以下を参照)。

sRGB -> Display Linear および Display Linear -> sRGB 変換は常に 両方 を有効にする必要があることに注意してください。それらのいずれかを有効にしないと、前衛的な実験的インディーズゲームにのみ適した恐ろしいビジュアルになります。

HDRのパラメーター

HDRの設定は Environment リソースにあります。 これらはほとんどの場合、WorldEnvironment ノード内にあるか、Cameraノードに設定されています。 詳細については、環境とポストプロセッシング を参照してください。