2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

UE5.8のTonemapとACES2.0

2
Posted at

はじめに

 UE5.8になって、手っ取り早くHDR時の明るさ調整に使っていた

r.HDR.Aces.SceneColorMultiplier

コマンドが機能しなくなっているのに気づき、軽く調査をしました。
どうやらTonemapperが変わったみたいです。

HDR運用のおさらい

 最初にUE5でHDRを使う場合のおさらいをしておきます。
 まず、DefaultEngine.iniなどにHDR使用可能を設定しておきます。

DefaultEngine.ini
[/Script/Engine.RendererSettings]
r.AllowHDR = 1

 これはエディタ起動後などに変更できないのでiniファイルで宣言しておく必要があります。
あとはディスプレイをHDR有効に設定して

r.HDR.EnableHDROutput 1

 でHDRに切り替わります。UE4時代と違ってエディタもHDR対応されているので大抵はこのままHDRで作業や確認ができるようになりました。

UE5.8のTonemapper

FilmicとStandard ACES

 UE5.8になってからTonemapperが2つから選択できるようになったみたいです。PostprocessVolumeのFilmの項目に選択が追加されています。
image.png
 FilmicStandard ACESの2種から選択できるようになっています。
 結論から言うとStandard ACESを選択することで前述の

r.HDR.Aces.SceneColorMultiplier

 が機能するようになります。
 が、ToolTipにあるように、Filmのほかの項目は機能しなくなるようです。SlopeとかToeとかですね。
 デフォルトではFilmicが使用されますが、PostProcessVolumeで指定されている場合はそちらが優先されます。強制的に設定したい場合は

r.LUT.TonemappingMethod

 で変更できます。

TAutoConsoleVariable<int32> CVarLUTTonemappingMethod(
	TEXT("r.LUT.TonemappingMethod"), -1,
	TEXT("Set the tonemapping method to transform colors for the output device.\n")
	TEXT("-1: Use PostProcessSettings (default)\n")
	TEXT("0: Filmic\n")
	TEXT("1: Standard ACES"),
	ECVF_RenderThreadSafe);

 デフォルトの-1ではPostProcessVolumeの設定が使用されますが、0でFilmic、1:でStandard ACESに切り替えることができます。
 Filmicの方はSDRで使用を想定、Standard ACESはHDRでの使用を想定しています。が、FilmicのままでもHDRで出力は有効で、Film系のパラメーターを使用したうえでSDRとHDRの見た目をあまり変えたくない場合にはSDRでもHDRでもFilmicを検討するのもアリみたいです。SDRとHDRでそれぞれのTonemapperを変えたい場合はコンソールコマンドで切り替えてやれば良いでしょう。

ACES2.0とACES1.3

 もうひとつ重要なのはACESのバージョンです。UE5.7ではデフォルトではACES1.3が使用されますが、UE5.8からはACES2.0がデフォルトになっています。
 ACESについてはちゃんと説明すると大変なのでこの記事では軽く流しますが、Academy Color Encoding Systemの略で、高ダイナミックレンジな画像をHDRディスプレイに出力するための規格のことで、リニアなHDR画像データをHDRディスプレイに特性にあわせてトーンマッピングする規格くらいの理解で良いかと思います。
 ACESの規格はバージョンが上がるにつれてアップデートされています。Geminiさんによると
image.png
 難しいこと書いてありますが、より洗練されて、高輝度なエフェクトの色が転びにくいくらいの理解で良いのかな?
 さて。デフォルトがACES2.0になったことで何が変わったかというと、輝度の調整方法が変わりました。これまでは輝度の調整には
r.HDR.Display.MaxLuminance
r.HDR.Display.MidLuminance
r.HDR.Display.MinLuminanceLog10
 の3つのパラメーターで低輝度、中輝度、高輝度のトーンカーブを設定していました。
それらに加えて
r.HDR.Aces.SceneColorMultiplier
 で一律輝度を調整できました。
 ACES2.0になってからは
r.HDR.Aces.SceneColorMultiplier
 は機能しますが、ベースの調整としては
r.HDR.Display.MaxLuminance
r.HDR.PaperWhite
 のふたつのパラメーターを使うことになりました。
 最大輝度と白い紙を表示したときの輝度を設定する感じでしょうか。PaperWhiteのデフォルト値は203になっています。
 この2つのパラメーターにはそれぞれ
r.HDR.PaperWhite.Mode
r.HDR.Display.OverrideOSMaxLuminance
 というパラメーターも存在し、OSやデバイスの既定値が使用可能ならそれを使うか、ユーザーが指定するかを選択できるようになっています。ちょっとコードを覗くと

PostProcessTonemap.cpp
	FTonemapperOutputDeviceParameters Parameters;
	Parameters.InverseGamma = InvDisplayGammaValue;
	Parameters.OutputDevice = static_cast<uint32>(OutputDeviceValue);
	Parameters.OutputGamut = static_cast<uint32>(Family.RenderTarget->GetDisplayColorGamut());
	static const IConsoleVariable* const CVarHDRDisplayOverrideOSMaxLuminance = IConsoleManager::Get().FindConsoleVariable(TEXT("r.HDR.Display.OverrideOSMaxLuminance"));
	Parameters.OutputMaxLuminance = CVarHDRDisplayOverrideOSMaxLuminance->GetBool() ?
		(bIsHDR ? HDRGetDisplayMaximumLuminance() : 100.f) :
		Family.RenderTarget->GetMaximumLuminanceInNits();

 r.HDR.Display.OverrideOSMaxLuminanceが0なら出力ターゲットから取得、そうでないならSDRなら100nits、HDRならユーザー指定の値を使うといった感じのようです。
 ポイントとしては、デバイスやOSで設定されていればその値が適用されるのでユーザーはあまり考えなくて良いようになっています。多くの場合はHDRに切り替えるだけでええ感じに出力してくれるという事でしょう。

ゲーム画面の明るさ調整

 さて、大抵のゲームではオプション設定などで明るさの調整を組み込むことになります。それをどう実装するかを考えてみます。SDR,HDRの両方に対応するが、なるべく大きく見た目が変わらず、設定も共通にしたい。そこで、
r.LUT.TonemappingMethod 1
r.HDR.Aces.Version 2
 は共通にしてみます。実はこの設定ではSDRでもHDRでも
r.HDR.Aces.SceneColorMultiplier
 が機能します。単純にこれで明るさを調整するのもひとつの手段です。その他にもSDRの場合は
r.TonemapperGamma
 でガンマカーブを変化させることで、明るい部分の輝度はそのままに暗い部分を調整することも可能です。明るい暗いだけでなく、視認性の調整には有効です。
 しかし、HDRの場合にはトーンカーブを調整することはあまり推奨されないと思います。HDRでは現実世界を想定して高いダイナミックレンジをなるべくそのまま出力することが目的なので。とは言え調整はしたいので、その場合は
r.HDR.PaperWhite.Mode 1
 で変更可能にして
r.HDR.PaperWhite
 で低~中輝度を調整するのが良いかと思います。
r.HDR.Display.OverrideOSMaxLuminance true
 にして
r.HDR.Display.MaxLuminance
 で最大輝度を下げたりするのも一手ですが、せっかく高輝度まで出力できるHDR出力のダイナミックレンジを下げてしまうのは勿体ないかなとも思います。

 UIの場合は従来の
r.HDR.UI.Level
 でも調整できますが
r.HDR.UI.Luminance.Mode
r.HDR.UI.Luminance
 がPaperWhiteに対応するものとして用意されています。

まとめ

 UE5.8で変化したHDRに関して軽く調べた結果をまとめました。以前に比べてHDRもずいぶん扱いやすくなってきた感じがします。とは言え、前提知識が筆者にも全然足りないので変な事を書いてそうで不安ではあります。おかしな部分があれば指摘してもらえれば幸いです。
 スマホやSwitch2などは最初からHDR使用可能なディスプレイが搭載されていることもあり、徐々にHDRがゲーム開発にも浸透しつつあるのかなあと思っています。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?