この記事は、2021年末のUE4アドベントカレンダーの記事、
UE4のHDR対応はどうなってるの?Win10編の後にわかったことなどをまとめた記事です。
記事を書いたときにはHDRの入り口で迷っていたレベルでしたが、自分もちょっと成長したのかな?
以下、UE4.27での状況です。
UE4エディタでHDRはちゃんと描画されない
はい、UE4エディタではHDRモードに切り替えることはできますが、正しく描画されません。これはPIE(Play in Editor)も同じです。なぜかというと、UE4エディタではゲーム画面を描画したあと、エディタUIに貼り付けてデスクトップ画面に表示されるのですが、エディタUIの描画そのものがHDR出力に正しく設定されていないので、そこにHDRのカラースペースの画像を貼り付けても正しい色で表示されません。この辺はUE5で改善されることを期待したいです。エディタ上で普通にHDR作業ができる時代はもうすぐです。きっと。
WindowsでのHDR対応の条件
WindowsでUE4でHDR描画をするためには次のような条件が必要です。
- r.AllowHDR=1 が設定されている。
- HDRディスプレイに接続されている
- Windows10以降でHDRが有効になっている
- DirectX12でビルドされている
- エディタからスタンドアローンで実行するか、ゲームビルドで実行する
1は起動後の変更ができないので、GameEngine.iniなりに記述しておく必要があります。コマンドラインオプションで -hdr を指定することでも設定できます。
2,3は当然ですね。
4はDirectX11でも排他的フルスクリーンならHDRにできるかもしれないですが、試してないです。
5は前述の通り。
以上の条件を満たしたところで、コンソールコマンドから
r.HDR.EnableHDROutput 1
r.HDR.Display.OutputDevice 3
でHDR描画に切り替わります。
ということで、HDRにするのは難しくありません。問題はここから。
HDRではUIが正しく描画されない
現在のところ、HDRでのUI描画には色々問題があります。順番に説明します。
UI CompositeMode
HDRに切り替えると、r.HDR.UI.CompositeMode=1がデフォルトで設定されます。この状態ではUIの描画の仕組みが変わります。具体的にはUIを全て別バッファに描画して、最後にまとめてゲーム画面に合成します。ちょうどSeparate Translucencyと同じようなものですね。
ところが、このモードにはいくつか問題があります。
カラー変換が正しくない
別バッファに描画されたUIをHDR画面に合成するときのカラースペースの変換に間違いがあり、正しい色で描画されていません。この問題に関してはUDNにも報告されており、修正方法が提示されています。
BackgroundBlurを他のUIが上書きしてしまう
BackgroundBlur自体は描画処理は行われているのですが、実際にUIが描画時に参照するのはBackgroundBlurが描画される前の画面なので、UIが上に描画されると無かったことにされてしまいます。この点もUDNでは修正方法が報告されています。
ただし、この修正でもUIの上にBackgroundBlurが描画された場合には反映されません。UI全体の背景としてBackgroundBlurは使用できますが、UIそのものをぼかしたいといった用途には使用できません。
UIのBlendModeがTranslucentに限定される
これは一旦別バッファに描かれたUIをアルファ値で一括合成するのが理由です。一括なのでアルファ値で合成することしかできません。Translucent以外のBlendModeで描画されたUIはすべてTranslucentとして描画されてしまいます。
UIの明るさは調整できる
これはありがたい機能で、r.HDR.UI.LevelでUI全体の明るさが調整できます。HDRディスプレイによってはSDRが相対的に暗い場合がありますが、そういった場合に調整できるのはありがたいですね。
UI CompsiteModeを切ると?
CompsiteModeを使用しないと上記の問題は回避でき、BlurもTranslucent以外のBlendModeも描画されます。しかし、HDR空間にsRGB空間で描画するため、色が正しく出ません。妙に濃かったりドギツイ色で描画されてしまったりします。
FilmicTonemapperが適用されない
ゲーム画面をFilmicTonemapperで調整していた場合、その調整がHDRには反映されません。FilmicTonemapperで画面を明るくしたり暗くしてた場合、HDRでは全く違う明るさになってしまいます。
同時にr.TonemaperGammaでの調整もできないので、HDR画面をユーザー環境にあわせて明るさ調整をしたいと思っても簡単にはできません。カラーグレーディングは機能するので、カラーグレーディング関連のパラメーターにHDR時にオフセットを加えるという手段はありそうです。
まとめ
ということでUE4のHDRにはまだまだ闇が広がっているみたいです。UE5もリリースされたことですし、UE5でのHDR対応が進んでいくのを期待したいところです。