【HDRと色彩管理3】SDRとHDR

このセクションは、HDRとACESの部分の下地にしているにすぎません。例として最もよく知っているsRGB色空間を取り上げ、主に、前述のさまざまな知識がSDRラインでどのように機能するかを学びます。 主には：
(1)色空間のViewing EnvironmentとImage State
(2)ゲームレンダリング用のSDR Color Pipelineはどのように機能しますか？
(3)Tonemappingは何ですか、必要となる理由は？
 
3.1理想の世界：HDR
---
PBRレンダリングでは、シーンを照らすために実際の照明値を参照することがよくあります。 たとえば、明るい日光環境は120k luxに達する可能性がありますが、月光は約0.25 luxにすぎません（[wiki](https://en.wikipedia.org/wiki/Daylight)を参照）。輝度（ Luminance）を使用して、特定の方向の単位面積あたりの発光強度（[Luminous Intensity](https://en.wikipedia.org/wiki/Luminous_intensity)、単位cdカンデラ）を測定します。そのSI単位（[International System of Units](https://en.wikipedia.org/wiki/International_System_of_Units)）はcd /m²（カンデラ/平方メートル）、つまりnitsです。 ここでは、明度（[Brightness](https://en.wikipedia.org/wiki/Brightness)）と輝度（[Luminance](https://en.wikipedia.org/wiki/Luminance)）の違いに注意してください。明度は主観的な視覚を表すことに対し、輝度は測光値です。
https://chrisbrejon.com/cg-cinematography/chapter-1-color-management/を参照
一般的なLCDモニターの輝度は約250nit、HDR TVは450〜1500 nit、蛍光灯は12,000 nit、太陽のは約16億nitです。

![1.1593844373430.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/39b498c1-2159-c7f2-ede7-15abb650cf5c.png)
Source: HDR in Call of Duty
 
特定の方向の単位面積あたりの光度を測定する輝度と同様に、よく目にするもう1つの物理量は照度（[Illuminance](https://en.wikipedia.org/wiki/Illuminance)）であり、そのSI単位はlm /m²（ルーメン/平方メートル）で、lux（ルクス）です。 照度は、単位面積あたりの物体の表面に入射する光束（Luminous Flux、単位lmルーメン）を測定する物理量です。 まとめると、輝度（Luminance、単位cd /m²）と光度（Luminance Intensity、単位cd）、照度（Illuminance、単位lm /m²）、光束（[Luminous Flux](https://en.wikipedia.org/wiki/Lumen_(unit))、単位lm）の関係は次のようになります（これらの光学物理量間の詳細な数学的関係は[wiki](https://en.wikipedia.org/wiki/Luminance)を参照できます）：
![2.1593844482527.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/fc2b2af4-18ec-b542-72e3-e08f22071350.png)
Source: HDR in Call of Duty
現在、UE4とUnity HDRPはどちらも物理的な照明パラメーターをサポートしているため、アーティストはエンジン内の現実世界のさまざまな光源を簡単にシミュレートして復元できます。物理的な照明環境についてLiWenleiが書いた[UE4 Blog（中国語注意）](https://www.unrealengine.com/zh-CN/tech-blog/real-physical-attributes-linghting-enviroment-in-ue4)をお勧めします。 UE4を例にとると、UE4はバージョン4.21で[物理ライトユニット](https://docs.unrealengine.com/4.27/en-US/BuildingWorlds/LightingAndShadows/PhysicalLightUnits/)を導入しました。
（１）平行光：照度（Illuminance）を使用して強度を測定します。つまり測定単位はluxです。
（２）静的光源としての天光およびその他の自己発光材料：輝度（Luminance）を使用して強度を測定します。つまり測定単位はcd/m²です。
（３）ポイントライト、スポットライト、サーフェスライト：発光強度（Luminance Intensity）と光束（Luminous Flux）のいずれかを選択できます。つまり、つまり測定単位はcdまたはlmです。
![3.1593844669853.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/46a9c2b6-2f48-9ef3-6878-f79311079932.png)

実世界の光の比率が非常に大きいことがわかります。レンダリングでこのハイダイナミックレンジレンダリング（[High Dynamic Range Rendering](https://en.wikipedia.org/wiki/High-dynamic-range_rendering)，HDR rendering）を復元して、レンダリングされた画像がより詳細でコントラストを保持できるようにします。Nvidiaは、HDRを使用する3つの動機をまとめました。
>Bright things can be really bright, dark things can be really dark, and details can be seen in both.
—— From Nvidia

照明値に比例するような色空間で作業する場合、この色空間を「シーン参照色空間Scene Referred Color Space」または「レンダリング空間Rendering Space」または「作業空間Working Space」と呼びます。
>A scene referred image is one whose light values are recorded as they existed at the camera focal plane before any kind of in-camera processing. These linear light values are directly proportional to the objective, physical light of the scene exposure. By extension, if an image is scene referred then the camera that captured it is little more than a photon measuring device.
—— From [this article](https://en.wikipedia.org/wiki/International_Electrotechnical_Commission)
 
レンダリングで最も一般的なシーン参照色空間は、sRGB色空間です。 ほとんどの場合、ゲームレンダリングで使用されるカラースタンプは、ほとんどがsRGB色空間で作成されます。Photoshopを例にとると、PSの色設定で現在の作業スペースを選択できます（次のsRGB IEC61966-2.1は長い名前ですが、最も頻繁に使用するsRGB色空間です）。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/84bdd407-fc27-c676-9a95-c48c473e10e4.png)
これらのsRGBスタンプは、sRGB OETF関数を介してエンコードされ、さまざまなスタンプ形式で保存されます。これらのsRGBスタンプをレンダリングエンジンにフィードします。エンジンがこれらのテクスチャを読み取ると、エンコードされた値がsRGB EOTF関数を介して元の線形カラー値にデコードされ、対応するBDRF照明計算が他の物理的なものと組み合わせて実行されます。
 
3.2厳しい現実：SDR
---

HDRレンダリングは素晴らしいですが、レンダリング結果を表示する必要がある場合、SDRディスプレイに遭遇します。 SDRディスプレイの2つの最も一般的な色空間標準は、sRGBとRec.709/BT.709です。以下は前の記事で言われたことのリマインダーです：
lRec.709：フルネームはITU-R Recommendation BT.709であり、Rec. 709、BT.709、ITU 709などと略されることがよくあります。1990年にHDTV（high-definition television）およびその他の分野の色空間標準として最初に提案されました。
lsRGB：フルネームはstandard Red Green Blueです。これはRec. 709から派生し、1996年にHPとMicrosoftによって開発され、ネットワーキング、Windows、印刷などの分野で使用されたRGB色空間標準です。 IEC委員会（[International Electrotechnical Commission](https://chrisbrejon.com/cg-cinematography/chapter-1-color-management/)）。によって設定されたIEC61966-2-1：1999によって標準化されており、指定された色空間を持たないすべての画像で使用される「デフォルト」の色空間でもあります。
 
これらのディスプレイデバイスに依存する色空間は、「Display/Output Referred Color Space」または「Display/Output Space」と呼ばれます。
>A display referred image is one defined by how it will be displayed. Rec.709 for example is a display referred color space meaning, the contrast range of Rec.709 images is mapped to the contrast range of the display device, a HD television.
—— From [this article](https://knarkowicz.wordpress.com/2016/01/06/aces-filmic-tone-mapping-curve/)

前回の記事では、この2つの色空間について簡単に触れましたが、実際にはまだ取り上げていない詳細がたくさんありますので、ここで説明します。 sRGBとRec.709の3つの原色と白色点の値はまったく同じです。つまり、CIE 1931 XYZ色空間の変換行列とまったく同じであり、それらの違いは転送関数にあります。別の伝達関数を使用する必要がある理由は、sRGBとRec. 709のViewing Environmentが異なるためです。
 
では、Viewing Environmentとは何ですか？後でさまざまな用語を理解しやすくするために、これまでに言及されていない色空間の他のいくつかの特性を説明します。完全な色空間を定義するときは、3つの原色、白色点、伝達関数に加えて、他のいくつかのプロパティも定義する必要があります。
（１）Image State：色空間をいくつかの異なる画像状態に分類します。最も一般的なのは、前述のScene Referred ImageとDisplay/Output Referred Imageです。
（２）Viewing Environment：Viewing Environmentの厳密な定義について、良く理解していません。ここでは、私自身の理解に基づいて、このプロパティが必要な理由を説明することしかできません。人間の目の視覚は適応性があるため、脳は現在の観察環境に依存して色を理解します。たとえば、同じ白い紙は明るい天光とタングステン光の両方で白と見なされますが、実際には2つの照明環境で異なる光を反射します。したがって、色空間の観測環境を定義する必要があります。これは、色空間の白色点値、伝達関数、およびその他の値に影響します。たとえば、DCI-P3の白色点とガンマは、ある程度に劇場などの薄暗い投影条件に適合しています。
（３）Data Type：データが8-bit、10-bit、16-bitのいずれであり、形式がinteger整数またはfloating point浮動小数点であるかなど、この空間でのカラーデータの範囲と精度を指定します。
sRGBとRec.709の違いに戻りましょう。 前述のように、sRGBとRec.709のViewing Environmentは異なります。 sRGB規格で想定されている表示環境は、PCの一般的なアプリケーションシナリオである、照明条件の良いオフィス環境です。 Rec。709規格の表示環境は、ホームシアターなどのより薄暗い照明環境で使用されます。したがって、それらの伝達関数は、それぞれの環境でより良く画像の詳細を表す関数曲線として選択されます。 これら2つの伝達関数を同じ画像に使用した場合の効果の対照は次のとおりです（画像の背景は観察環境を示しており、右側の画像のコントラストが暗い部分で強くなっていることがわかります）。
![5.1593845306046.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/5b795c93-13ab-b15f-2e65-6a16f0746a91.png)
Source: HDR in Call of Duty
Rec.709規格は、実際にはデジタルカメラの正確なOETF伝達関数（encoding function、camera gamma/scene-referred gammaとも呼ばれます）のみを定義し、表示用のEOTF伝達関数を指定していないことに注意してください。 この正確なOETF関数は次のとおりです。
![6.1593845337868.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/dd57ccf1-a368-b7b6-a4bb-4c1c86e52211.png)
このうち、Lは0〜1のシーン輝度値に正規化され、Vはエンコードされたデジタル信号値を表します。Rec.709自体はEOTF（display referred gamma）を指定していないため、委員会はITU-R BT.1886（BT.1886）のRec.709の表示ガンマ関数EOTF（decoding function）を指定しました。この関数は次のとおりです。
![7.1593845359572.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/7f239b7b-80b2-57ad-f587-08c0ce94f0be.png)
ここで、aとbは2つの定数パラメーターであり、ターゲットディスプレイのblack levelとwhite levelの値から導出できます。理想的な条件下のディスプレイデバイスの場合、そのblack levelは純粋な黒であると見なすことができ、上記のEOTFは純粋な2.4ガンマ曲線になります。 これは、CES Rec. 709 Output Transformで使用される関数曲線でもあります（ACESについては後で詳しく説明します）。
 
対照的に、sRGB色空間標準のOETF関数は次のように定義されています。
![8.1593845417906.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/e4612388-8875-aec2-f5fe-71dc10fd6685.png)
このうち、Lは0〜1のシーン輝度値に正規化され、Vはエンコードされたデジタル信号値を表します。 sRGBのEOTF関数は次のように定義されています。
![9.1593845437471.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/51f8972f-c822-d4fc-8c25-e126a99776de.png)
IEC 61966-2-1：1999で規定されている規格は上記のとおりですが、sRGB画像のEOTFが正確に何に使用されるかについてはいくつかの論争があります。 sRGBの伝達関数は2.2のガンマ曲線に近似しているため、sRGB OETFの線形部分は、0に近い部分の量子化誤差の低減を防ぐためだけのものであり、その本質は2.2のガンマ曲線であると考える人もいます。彼らは、モニターを校正するための純粋な2.2EOTFガンマ曲線を使用すべきだと考えています。これにより、ユーザー端末のsRGBディスプレイに表示される輝度値がさらに不確実になります。これらの複雑で混沌とした状況については、ここでは詳しく説明しません。
 
これまでのところ、ゲームでのHDRレンダリングからSDR表示までの一般的なプロセスは、次のように要約できます。
1.Photoshopなどの描画ツールで生成されたsRGB空間のカラー画像は、sRGB OETFを介して線形カラー値を非線形信号値にエンコードして保存し、レンダリングエンジンに送信します。
2.レンダリングエンジンは、非線形データをsRGB EOTFを介して線形カラー値に再デコードし、線形レンダリングパイプラインに入力します。
3.線形レンダリングパイプラインは、物理的な光パラメータと線形オブジェクトのマテリアルプロパティを使用して、対応するBRDF計算を実行し、最終的にダイナミックレンジの高いscene referred imageを取得します。
4.使用するSDRディスプレイの色空間標準に従って、上記のscene referred imageに対して色空間変換を実行し、ディスプレイの色空間のOETFを使用して、ディスプレイが読み取れるビデオ信号にエンコードし、display referred imageを取得します。
5.SDRディスプレイは、EOTFを使用して、エンコードされたdisplay referred image信号値を最終的にディスプレイ画面の輝度値に変換します。
 
ほとんどの場合、ゲームで使用されるSDR Color Pipelineのscene-referredとdisplay referred色空間は、sRGB / Rec.709で使用される3原色と白色点の値であるため、手順4での色空間変換は通常は省略でき、sRGB OETF（PC）またはRec.709 OETF（TV）を直接使用して、scene referred imageをdisplay referred imageに変換します。つまり、sRGB PCディスプレイを出力する最も単純なSDR Color Pipelineの場合、ゲームエンジンが実行する必要のあるプロセスは次のように簡略化できます。
6.sRGBカラースタンプにsRGBEOTFデコードを実行します
7.線形レンダリング空間でのシーンレンダリングを行います
8.LinearTosRGBなどの関数を使用してsRGBOETFで最終出力をエンコードし、ディスプレイに送信します
 
これは、よく言われる線形空間レンダリングとガンマ補正のプロセスです。

---

 
3.3 HDRからSRDへ：Tonemapping
---
 
上記のSDR Color Pipelineには致命的な問題があります。scene referred imageからdisplay referred imageに変換するプロセスでは、これらの高ダイナミックレンジの輝度値を非常に制限されたディスプレイ輝度値に変換する必要があります。sRGBのOETF関数を振り返ると、出力値Vは0〜1の範囲のビデオ信号値である必要があり、入力値Lの範囲は0〜1の間である必要があります。HDRレンダリングで得られたシーンカラー値をLとしてOETF関数に直接入力すると、1を超える輝度値は完全に失われます。これにより、最終的にレンダリングされた画像のコントラストが非常に低くなり、中間の灰色の値が明るすぎ、ハイライトが完全に切り捨てられます。
![10.1593845835477.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/63a67c1f-46e5-7bb0-7ea9-29b7df626a1b.png)
Source: https://chrisbrejon.com/cg-cinematography/chapter-1-color-management/
 
この問題を解決するには、scene referred imageからdisplay referred imageに変換するプロセスで変換ステップ——Tonemappingを挿入する必要があります。Tonemappingは、シーン内の光源の輝度やマテリアルプロパティを実際に変更する必要はなく、画像の表示方法を変更します。フィルムや撮影にも同様の概念があります。Tonemappingは近年提案された新しい用語ですが、長い間、特に現実的なスタイルを描くの創造的なプロセスでは、アーティストに使われてきました。初期の画家は、絵を描くときの顔料の特性と種類が限られていたため、顔料を使用して実際のシーンをキャンバスに再現しようと最善を尽くします。この動作自体が、Tonemappingを適用するベストプラクティスと言えます。フィルムの領域でも、Tonemappingのような操作で、シーンの輝度をフィルムが表現できる限られた輝度の範囲に再マッピングする必要があります。
 
グラフィックスでは、Tonemappingの本質は、関数を使用して高ダイナミックレンジの輝度値を0-1の範囲にマッピングすることです。ゲーム開発の歴史には、最も初期の最も単純な経験派である[Reinhard](http://www.cmap.polytechnique.fr/~peyre/cours/x2005signal/hdr_photographic.pdf)から、アンチャーテッド2で使用された適合派である[Hable Filmic](http://filmicworlds.com/blog/filmic-tonemapping-operators/)、使いやすさとパフォーマンスを向上させるための改良版の[Filmic Curves](http://filmicworlds.com/blog/filmic-tonemapping-with-piecewise-power-curves/)、更に集大成の[ACES Filmic Tonemapping](https://knarkowicz.wordpress.com/2016/01/06/aces-filmic-tone-mapping-curve/)まで、さまざまな種類のTonemapping曲線がありました。より詳細な比較については、[トーンマッピングの進化（中国語注意）](https://zhuanlan.zhihu.com/p/21983679)を参照してください。また、さまざまなトーンマッピング曲線の効果の比較については、[MJPのブログ](https://mynameismjp.wordpress.com/2010/04/30/a-closer-look-at-tone-mapping/)を参照してください。
 
Tonemappingは現在まで発展しており、基本的にはSカーブを使用して各領域（shadow、midtone、highlight）のパフォーマンスを制御するようにでき、カーブの中央部分のコントラストを増加させ、両端を縮小させます：
![11.1593846027015.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/313ea02f-afe6-0ddd-1e84-cb2735dcd483.png)
Source: https://chrisbrejon.com/cg-cinematography/chapter-1-color-management/
ACES Filmic Tonemappingカーブでは、輝度が1である値が約0.86に再マッピングされます。これは、元のシーンで1を超えるハイライトされた部分が0.86〜1の範囲に再マッピングされることを意味します。 これにより、最終的にレンダリングされた画像は、より多くの照明の詳細とコントラストを保持でき、画像はより鮮明になります。
![12.1593846077613.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/76a0e92b-c80e-536d-0c15-d995564436ef.png)
Source: https://chrisbrejon.com/cg-cinematography/chapter-1-color-management/
 
Tonemapping以外、HDRレンダリングに密接に関連する別の計算は露出（Exposure）です。 簡単に言えば、露出は輝度のスケーリング倍率です。たとえば、天光を使用するシーンの場合、撮影の分野でよく知られている[太陽光16のルール](https://en.wikipedia.org/wiki/Sunny_16_rule)を参照し、レンダリングされた画像の輝度をスケーリングできます。
 
このように、TonemappingとExposureを追加した後、比較的完全な初期のSDR Color Pipelineを取得できます。 以下は、HDR Color Pipelineを使用する前に、コールオブデューティインフィニットウォーフェアとアドバンスドウォーフェアの以前の作品で使用されたSDR Color Pipelineです。
![13.1593846338418.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/772c0a39-9f76-33fc-c663-1390f995aa4e.png)
Source: HDR in Call of Duty
図にある手順は次のとおりです。
（1）青い枠付けの部分は、Scene Referredスペースでの操作を表しています。これは、sRGBの3原色で表される線形カラー値を使用し、レンダリングされたシーンの輝度の値は数千ニットに達する可能性があります。このHDR Scene Referred（sRGB linear space）では、いくつかの後処理計算も適用されます。
（２）露出曲線とTonemapping曲線を使用して、シーンの輝度を表示可能な範囲に再マッピングします。
（３）その後、sRGB OETF伝達関数を使用してデータをエンコードします。このステップでは、sRGB gamma space（緑色の枠付けの部分）であるDisplay Referred色空間に変換しました。
（４）sRGB gamma spaceで、後続のSDR後処理計算、Color Grading、AAとUIレンダリング操作を引き続き実行します。
（５）最後に、信号がSDRディスプレイに送信され、ディスプレイアプリケーションEOTFによってエンコードされた電気信号が再び実際のディスプレイの輝度に変換されます。
 
3.4将来のトレンド：HDR Display

ハードウェアテクノロジの継続的な更新に伴い、既存のSDR Color Pipelineの欠点が徐々に明らかになります。まず、sRGB/Rec.709色空間の色域は非常に限られており、CIE 1931色空間の約35.9％しか占めていません。そして、異なるSDRディスプレイデバイスのピーク輝度は異なり、SDRTVは一般にSDRPCディスプレイのピークよりも明るいです。たとえば、sRGB CRTディスプレイの明るさは約80cd /m²で、120 cd /m²に調整できますが、ほとんどのLCD TVモニターは200〜300cd/m²の輝度を実現できます。したがって、より良い視覚効果を得るために、異なる輝度ピークを持つSDRディスプレイに異なるTonemapping曲線を使用することをお勧めしますが、これは、異なる出力デバイスとの互換性が必要であることも意味します。
 
この種のデバイスの互換性は、HDRディスプレイの導入後、より複雑になります。どのように最小限のコストのもとで、レンダリングされた画像をさまざまなSDRおよびHDRディスプレイで一致している画面を得るか、より多くの3Aゲームのレンダリングに対しては考慮すべき方向です。幸いなことは、映画およびテレビ業界によって提案されたACES（Academy Color Encoding System）は、多くの互換性作業を削減する統一されたソリューションを提供します。これについては、次の記事で説明します。

---

参考文献：
(1)https://chrisbrejon.com/cg-cinematography/chapter-1-color-management/
(2)[Digital Dragons 2018: HDR in Call of Duty](https://research.activision.com/publications/archives/hdr-in-call-of-duty)
(3)https://www.tftcentral.co.uk/articles/pointers_gamut.htm
(4)https://nick-shaw.github.io/cinematiccolor/common-rgb-color-spaces.html
(5)https://64.github.io/tonemapping/

---
UWA Technologyは、モバイル/VRなど様々なゲーム開発者向け、**パフォーマンス分析**と**最適化ソリューション**及び**コンサルティングサービス**を提供している会社でございます。

今なら、UWA GOTローカルツールが**15日間に無償試用**できます！！
よければ、ぜひ！

UWA公式サイト：https://jp.uwa4d.com
UWA GOT OnlineレポートDemo：https://jp.uwa4d.com/u/got/demo.html
UWA公式ブログ：https://blog.jp.uwa4d.com