UE5.1のHDRはどうなった？

# UE5.1のHDR
　UEのHDR対応については以前記事にしました。
[UE4のHDR対応はどうなってるの？Win10編](https://qiita.com/dgtanaka/items/672d2e7b3152f4e5ed49)
[UE4のHDR対応その後](https://qiita.com/dgtanaka/items/44a6b41448959f0ec369)

　その後、お仕事でもHDR対応ゲームをリリースし、まあまあHDRに関する知識も増えたのですが、それでもやはり難しいです。基礎からちゃんと勉強しないとなあと思っている次第です。

## エディタでのHDR
　さて、UE5.1ではエディタ上でHDR作業ができるようになるという話を関係者から伺っていたので、ざっと調査してみました。
　GitHubから取得したUnrealEngineをビルドして、Third Person Shootingテンプレートでエディタを起動しました。
　まずはHDRが有効になっているかを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147177/7df57ece-47e7-2ee5-1a33-717f44569394.png)
　デフォルトでは無効なようです。
　DefaultEngine.iniで有効化します。

```DefaultEngine.ini
[/Script/Engine.RendererSettings]
r.RayTracing=True
r.AllowHDR=1
```
　エディタを再起動して、コマンドプロンプトからHDRへ切り替えてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147177/3706a181-dcd0-081d-ba62-4f16c9cdecfd.png)

　なんだかWarningが出てますが、HDR有効になったようです。
　UE4ではエディタのUIの色がおかしくなったりしていましたが、問題ないみたいです。

　OutputDeviceを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147177/7b08511e-a171-77b2-4fb9-6cb4bb8a2d97.png)
　OutputDeviceは5になっています。これは以前の記事でも触れましたが、OutputDeviceは以下のように定義されています。

```TonemapCommon.ush
/** Values of DIM_OUTPUT_DEVICE (matching C++'s EDisplayOutputFormat) */
#define TONEMAPPER_OUTPUT_sRGB 0
#define TONEMAPPER_OUTPUT_Rec709 1
#define TONEMAPPER_OUTPUT_ExplicitGammaMapping 2
#define TONEMAPPER_OUTPUT_ACES1000nitST2084 3
#define TONEMAPPER_OUTPUT_ACES2000nitST2084 4
#define TONEMAPPER_OUTPUT_ACES1000nitScRGB 5
#define TONEMAPPER_OUTPUT_ACES2000nitScRGB 6
#define TONEMAPPER_OUTPUT_LinearEXR 7
#define TONEMAPPER_OUTPUT_NoToneCurve 8
#define TONEMAPPER_OUTPUT_WithToneCurve 9
```
　ACES1000nitScRGBが設定されています。
　scRGBというのは、今まで一般に使用されてきたsRGBよりもかなり色域が広い色空間です。最大輝度1000nitのScRGBで出力されているようです。

## HDR時のUI描画
　まずはエディタ上でもHDRで描画されているらしいことを確認しました。UI描画はどうなってるでしょうか。

　UE4のHDR描画ではUIの描画にいろいろ問題がありました。それについては[UNREAL FEST WEST'22の講演](https://www.docswell.com/s/EpicGamesJapan/KXREYK-UE_UFE22W_SQEX_Soleil)で触れているので御覧ください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147177/86f1d1a7-9113-6813-a350-5c91f792318d.png)
　CompoisteModeは1ですね。つまりUIは出力画面に直接描画されず、別バッファにすべて描画したあとに出力画面に合成されるモードです。
　UE4ではこのモードではUIのブレンドでBackground BlurやAddtiveやModulateが使用できませんでしたが、UE5.1ではどうでしょう。こんなUI Widgetを組んでみました。上からTranslucent, Modulate, Addtive, Background Blurを配置しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147177/d2bc0b50-b33b-95ab-abb7-859e51c0368e.png)
　これをゲーム画面に描画するとこうなりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147177/5091ea26-572f-ff79-bec4-4715952c706e.png)
　HDRでキャプチャしたものを画像にすると実際の見た目と同じにはならないですが、おおよその感触は伝わるかと思います。
　Modulateは描画されず、AddtiveはTranslucentと同じみたいです。Background Blurはちゃんと描画されています。テキストの上からブラーがかかっているので、UE4で改造しても最後面にしか描画されなかった問題も解消されているみたいです。キャプチャ画像では潰れてますが、実際の画面ではちゃんと表示されていました。

　SDRではこうなってます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147177/b850fb57-7cae-9630-67b8-c8fb5a2c4de4.png)

　RenderDocで描画の過程を見ると面白いですね。エディタUIも含めてあらゆるUIをバッファに描画しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147177/bcfa98d5-14dd-ab7d-c129-ed0d174e972e.png)
　そして、その結果をView画面と合成して最終的な画面出力にしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147177/b56c0e8c-7949-f52b-7aee-d23818fe6031.png)

## UIの明るさ
　HDR状態ではUIの明るさを変更するコマンドがあります。
>r.HDR.UI.Level

　これでView画面とは独立してUIの明るさを変更できますが、エディタ上ではView画面のUIもエディタUIもまとめて明るさが変わります。View画面との合成時にUIターゲットの明るさを調整しているので、ゲームUIとエディタUIを別々に調整はできません。
　また、UE4にはなかった
>r.HDR.UI.Luminance

　というコンソール変数が追加されています。こちらでもUI全体の明るさを調整できます。

```
static TAutoConsoleVariable<float> CVarHDRUILuminance(
	TEXT("r.HDR.UI.Luminance"),
	300.0f,
	TEXT("Base Luminance in nits for UI elements when compositing into HDR framebuffer. Gets multiplied by r.HDR.UI.Level"),
	ECVF_RenderThreadSafe);
```
　UIの輝度をnitで調整するみたいですね。r.HDR.UI.Levelはこれに乗算するみたいなので、UE5.1からはr.HDR.UI.Luminanceでベースの輝度を設定して、Levelで調整が良いのかなと思います。デフォルトが300になっていますが、一般的なSDRディスプレイの明るさが300nitくらいと言われているのでそれにあわせた数値でしょうか？

　ということで、エディタ上でHDR描画は機能しているみたいです。ただし、やはりフィルミックトーンマップはHDRでは無効みたいで変更しても画面に変化はありませんでした。

## HDR関連の拡張
　コンソールコマンドからr.hdrと入力するとHDR関連のコンソール変数が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147177/fed55fb9-5bcf-f138-b32a-21a420a2b7ef.png)
　いろいろ増えてますね。とくに r.HDR.Aces.SceneColorMultiplier でHDR描画の明るさの調整ができたり、 r.HDR.Display.MinLuminanceLog10, r.HDR.Display.MidLuminance, r.HDR.DIsplay.MaxLuminanceでディスプレイにあわせたコントラスト調整ができるようになっているのはとてもありがたいです。UE5.1からは実用的なHDRの明るさ調整ができるようになりそうです。MinLuminanceだけLog10が付いているのは0に極めて近い小さな数字を指定できるようにしているのだと思います。デフォルトが-4なので実際の値は0.0001ということかなと。
　なんといっても一番大きいのは、これらのパラメーターがエディタ画面上で調整できるということです。UE4時代はゲームビルドを作成して実行しないと実際のHDR描画を確認することができなかったので。
　UE5.1からはエディタ上でアーティストがライティングやエフェクトなどをリアルタイムに確認しながら作業できる時代になりそうです。　

　追加されたコンソール変数にこんなものも。
```
static TAutoConsoleVariable<int32> CVarEditorHDRSupport(
	TEXT("Editor.HDRSupport"),
	0,
	TEXT("Sets whether or not we should allow the editor to run on HDR monitors"),
	ECVF_Default);

static TAutoConsoleVariable<float> CVarEditorHDRNITLevel(
	TEXT("Editor.HDRNITLevel"),
	160.0f,
	TEXT("Sets The desired NIT level of the editor when running on HDR"),
	ECVF_Default);
```
　これらはエディタの環境設定のここからも設定できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147177/4ac2a931-8463-49e6-67c2-87f4b932ecec.png)

　ただし、Editor.HDRSupportはWindowsD3D11Viewport.cppからしか参照されていないので、D3D11限定の設定のようですし、Editor.HDRNITLevelも変更しても変化は無いし。D3D11で起動すると変わるのかもしれませんが、筆者はD3D12でしか起動しないので深追いしません。気になる人は調べてみてください。

## ビルドでのHDR
　ビルドでのHDRとエディタでのHDRは出力デバイスが違うので注意が必要です。このへんの話は以前の記事にも書きましたが、ビルドでのOutputDeviceは3、つまりACES1000nitST2084です。これは最大輝度が1000nitで色空間はST2084、Dolby-PQカーブなのでエディタとはバッファ上の数値が異なります。RGBのビット数も3は10bitに対して5は16bitです。最終的にディスプレイに出力されるとほとんど同じ結果になるはずですが、ポストプロセスマテリアルでAfterTonemappingで描画すると、ポストプロセスの描画対象がscRGBかST2084かで結果が全く違うので注意が必要です。HDR対応するならAfterTonemappingは使用しないのが無難です。

# まとめ
　さて、UE5.1のHDR対応をさらっと確認しました。ポイントとしては
- エディタでもHDR表示が可能になり、エディタUIが色バケしたりもしなくなった。
- UIのブレンドモードはUE4同様制限あり。Background Blurは使える。
- HDRの明るさ調整機能が充実した。

　といったところです。UE4よりも格段にHDRでの調整がしやすくなりました。

　参考までにミーアキャットデモをエディタ上でHDR表示にしたものをiPhoneで撮影したもの。
![Fj_gTasaYAE-MB2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147177/710337e1-9009-800c-bc7d-8d509ec7598c.jpeg)
　って、伝わらないですね。HDRをSDRで説明する難しさは相変わらずです。