🎞️

Unity で HDR 出力を機能させるためのプロジェクト設定メモ

2021/09/01に公開

はじめに

Unity は HDR ディスプレイ出力機能をサポートしていますが、普通に Unity いじっていると大体は SDR にトーンマッピング (か単純にクリッピング) されてしまい HDR 表示になりません。実際に HDR 出力をしようとした場合のポイントをまとめておこうかと思います (自分用備忘録) 。

Unity は 2021.1.16f1 で確認 (一部 2020.3.14f1 でも確認していますが 2021.1 と同じっぽい) しています。 2021.2 は b9 が私の PC で起動しない (起動直後に即落ちをする) ので確認できていません。

共通

プラットフォームは Windows 。 HDR ディスプレイ出力の機能を ON にするために次の設定をします。

  • DX12 モードで起動する (-force-d3d12 を付ける)
  • Project Settings - Player を開いて下記設定を確認
    • "Rendering - Color Space" は Linear にする
    • "Use display in HDR mode" をチェック
    • Swap Chain Bit Depth を "Bit Depth 16" にする

加えて実際に HDR 出力を有効に機能させるには次の手順が必要です (詳細は次項) 。

  • カラー値をクリッピングする処理をカットする
    • Unity 標準の Color Grading, Tonemapping など (これらは SDR 出力を前提にしている)
  • (必要なら) HDR 向けの Color Grading 、色空間変換等を既存の Post Process の後に入れる (Custom Post Process)

Linear Color Space での RGB 値 0.0-1.0 の範囲が SDR(sRGB) の色に相当し、 HDR 出力時はこの範囲外の値でも (全てではないですが) 表示できます。
"Swap Chain Bit Depth = Bit Depth 16" の設定では Linear Color Space での RGB 値そのものなのでそのまま出力する事が可能です。
"Bit Depth 10" は BT.2100(PQ) になるため自前で色変換が必要になります。通常 Windows においては選択するメリットはないと思いますがプラットフォームによっては指定の色空間変換が必要になるケースもあるでしょう。

BuiltIn RP

BuiltIn RP は既定では Tonemapping 等は入っていないので、例えば適当に Lighting の Intensity を強くして 1.0 を越えるようにしてもクリッピングされずに表示に反映されます。

標準 Post Process の調整 (Post Processing Stack)

BuiltIn RP で Post Processing Stack を利用している場合、 Post Processing Profile の "Color Grading - Tonemapping" が有効になっていると SDR 範囲に丸め込まれるのでチェックを外して無効にします。

Custom Post Process (OnRenderImage)

BuiltIn RP では OnRenderImage が使えるので、このタイミングで Color Grading 、色空間変換処理を入れる事ができます。

OnRenderImage は割と手軽に使えるので私はテスト用の素材を作るのに OnRenderImage + PixelShader のみで映像を生成し EXR で保存するということをよくやります。テスト素材作りに結構便利です。

URP

URP は Camera の "Rendering - Post Processing" のチェックを外して Post Process をなしにすると HDR 表示になりました。 Post Processing ON のまま Tonemapping (Volume の中にあります) のチェックを外しても HDR になりませんし、 Volume を丸ごと無効にしてもダメのようです。
標準 Post Process を全て無効にするのはちょっと考えにくいので HDR 出力目的で URP を選択するのは現状難しそうです。

HDRP

標準 Post Process の調整 (Volume)

HDRP では下記設定を変更することで HDR ディスプレイ出力が可能になります。

  • Project Settins - HDRP Default Settings を開き、 Default Frame Settings For (Camera) の "Rendering - Dithering" のチェックを外す
  • 使用中の Volume Profile の設定を開き (HDRP Default Settings からでも設定可)、 "Tonemapping" のチェックを外す

Dithering が入っていると HDR じゃなくなるのは Dithering の処理を sRGB 空間でやってるためのようですね。

https://github.com/Unity-Technologies/Graphics/blob/d0aede8a49d36e76de3679725b53d4ba05a452db/com.unity.postprocessing/PostProcessing/Shaders/Builtins/Dithering.hlsl

Custom Post Process

HDRP では HDAdditionalCameraData の customRender イベントを用いれば可能のようです。手順的にはカメラを二つ用意し、

  • a) RenderTexture にシーンを描画
  • b) a) の結果をソースに customRender で処理を加えてディスプレイに書き出す

となります。 keijiro さんの下記プロジェクトが参考になります。

おわりに

Unity に HDR 出力機能が実装されてからそこそこ時間が経ちましたが、そこから特にアップデートがされていないなあという印象です。ハードウェアの HDR 出力を ON にするだけではなく、 HDR 出力を前提としたレンダリングパイプラインをどう構成するかが大事だったりするわけですが、現状は開発者に丸投げどころか URP では実質不可能なようなのがちょっと驚きました。

HDR 出力を試すには HDRP プロジェクトテンプレートを用いるのが手っ取り早いと思います。上記手順のみ (Custom Post Process なし) だと Color Grading のない素通りの映像になりますが、結構よい印象の映像になるのでどんな感じの映像になるのか見てみるとよいかなと思います。

Discussion