Unrealエンジンにおけるトーンマッピング
更新日時: 2026/04/14
Meta Questにおいて、トーンマッピングに関連する従来のパフォーマンスコストを生じさせることなく、Unreal Engineの特定のトーンマッピングエフェクトを使うことができます。Meta Quest統合では、約600マイクロ秒の追加レンダリング時間でトーンマッピングをレンダリングできます(実際のパフォーマンスはデバイスやシーンの複雑さによって異なります)。これを実現できるのは、この統合ではUnrealエンジンのモバイルHDRモードや追加レンダーパスではなく、Vulkanサブパスを使用しているためです。
Vulkanトーンマップサブパスは、次のポストプロセスエフェクトをサポートします。
- カラーグレーディング(LUTを含む)
- フィルムトーンマッピング
- ビネット
グラフィックショーケースのサンプルでは、よく使われる3種類のトーンマッピングエフェクトが紹介されています。
- フェードイン/フェードアウト
- 色合い昼夜サイクル
- カラーグレーディングLUT
- ビネット
グラフィックショーケースサンプルアプリは次の場所で入手できます。
トーンマッピングのVulkanサブパスを有効にするには、r.Mobile.TonemapSubpass=1を設定します。
トーンマッピングが不要な場合にパフォーマンスを回復するためにVulkanサブパスを無効にするには、r.Mobile.TonemapSubpass=0を設定します。
このコンソール変数は、以下のいずれかの方法で設定できます。
DefaultEngine.ini: プロジェクトのDefaultEngine.iniで、[/Script/Engine.RendererSettings]セクションに以下を追加します。
[/Script/Engine.RendererSettings]
r.Mobile.TonemapSubpass=1
- ランタイムでのコンソールコマンド: コンソール経由で
r.Mobile.TonemapSubpass 1を実行します。 - C++またはBlueprint:
Execute Console Command Blueprintノードを使用するか、r.Mobile.TonemapSubpass 1というコマンド文字列を指定してプレイヤーコントローラーでConsoleCommand()を呼び出します。
Note
トーンマップサブパスは、モバイル遅延シェーディングと互換性がありません。モバイル遅延シェーディングが有効になっている場合、トーンマップサブパスは自動的に無効になります。トーンマップサブパスは、複合現実アプリでHDRレンダリングやパススルーと併用できます。そのためには、パススルーブレンディングのためのアルファチャネルデータを含む特定のシーンカラーフォーマットが必要です。
デフォルトの場合、HDRはPF_FloatR11G11B10ピクセルフォーマットを使用しており、アルファチャネルはありません。パススルーブレンディングにはアルファデータが必要なため、PF_A2B10G10R10フォーマットに切り替える必要があります。
パススルーでHDRを有効にするには:
次の行をプロジェクトのDefaultEngine.iniに追加します。
r.Mobile.SceneColorFormat=4
これにより、シーンのカラーフォーマットがPF_A2B10G10R10に設定され、パススルー合成に必要なアルファチャネルが提供されます。
r.Mobile.TonemapSubpass=1を設定して、上記のようにトーンマップサブパスを有効にします。
Note
r.Mobile.SceneColorFormat=4がない場合、デフォルトのHDRピクセルフォーマット(PF_FloatR11G11B10)にはアルファチャネルデータが含まれていないため、パススルーブレンディングが正しく機能しません。特定のトーンマッピングエフェクトは、後処理ボリュームプロパティとレベルシーケンスで値を変更すれば実装できます。Vulkanサブパスは以下をサポートします。
- レベルシーケンスでのフェードトラック
- 後処理ボリュームプロパティでのシーン色合い
- 後処理ボリュームプロパティでのカラーグレーディングLUT
- 後処理ボリュームプロパティでのビネット
フェードインとフェードアウトは、レベルシーケンスにフェードトラックを追加し、フェードトラック上でキーポイントを定義することにより実装できます。フェード値1.0は完全不透明の黒、0.0は完全透明です。
フェードを実装するには、次のようにします。
メインツールバーから、[Cinematics(シネマティクス)] > [Add Level Sequence(レベルシーケンスを追加)]をクリックします。
シーケンサーで、[+ Track(トラック追加)]をクリックしてから、[Fade Track(フェードトラック)]を選択します。
フェードトラックを選択し、[o]をクリックして、キーフレームを追加します。
後処理ボリュームを追加し、ボリュームのシーン色合いプロパティを変更することで、色合いやトーンを追加できます。
基本的な色合いを追加するには、次のようにします。
[Post Process Volume (後処理ボリューム)]アクターをレベルに追加します。
[Post Process Volume Settings (後処理ボリュームの設定)]プロパティに移動し、[Enabled (有効)]と[Infinite Extent (Unbound) (無限(制限なし))]を選択します。
[Color Grading|Misc(カラーグレーディング|その他)] > [Scene Color Tint(シーン色合い)]プロパティを、目的の色合いに設定します。
シーケンサーを使って、後処理ボリュームの色合いを時間と共に変化させることによって、昼夜サイクルをアニメーション化できます。例えば、シーン色合いを、夜間は青、明け方は赤、昼は自然白色と徐々に変化させることができます。
シーン色合いプロパティの変更シーケンスを作成するには、以下のようにします。
メインツールバーから、[Cinematics (シネマティクス)] > [Add Level Sequence (レベルシーケンスを追加)]をクリックします。
シーケンサーで、[+ Track(トラック追加)] > [Actor to Sequencer(アクターをシーケンサーに)]をクリックした後、後処理ボリュームを選択します。後処理ボリュームがシーケンサーに追加されます。
シーケンサーに追加された後処理ボリュームで、[+ Track(トラック追加)] > [Settings(設定)] > [Color Grading|Misc(カラーグレーディング|その他)] > [Scene Color Tint(シーン色合い)]をクリックします。シーン色合いの設定がシーケンサーに追加されます。
[Scene Color Tint (Settings)(シーン色合い(設定))]を展開し、[o]をクリックして、目的の場所にキーフレームを追加します。
カラーグレーディングLUTを適用するには、次のようにします。
LUTテクスチャーをプロジェクトに追加します。
[Post Process Volume (後処理ボリューム)]アクターをレベルに追加します。
[Post Process Volume Settings (後処理ボリュームの設定)]プロパティに移動し、[Enabled (有効)]と[Infinite Extent (Unbound) (無限(制限なし))]を選択します。
[Post Process Volume(後処理ボリューム)] > [Color Grading(カラーグレーディング)]プロパティに移動します。
[Color Grading LUT (カラーグレーディングLUT)]を選択し、適用するLUTテクスチャーをリストから選択します。
後処理ボリュームのレンズ画像エフェクトのプロパティを使用して、楕円ビネットを適用することができます。
基本的なビネットを追加するには、次のようにします。
[Post Process Volume(後処理ボリューム)]アクターをレベルに追加します。
[Lens(レンズ)] > [Image Effects(画像エフェクト)]プロパティに移動し、[Vignette Intensity(ビネット強度)]を選択して設定します。
r.Mobile.TonemapSubpass=1を有効にすると、トーンマップサブパスなしのレンダリングに比べて、色の彩度が目に見えて増加する可能性があります。これは、Unreal Engineのデフォルトのフィルムトーンマッパーが、トーンマップサブパスが無効なときにはアクティブでないトーン曲線を適用するためです。
トーンマップサブパスを有効にしたまま元の色の表示を復元するには、以下のいずれかの方法でトーンカーブを無効にします。
- コンソール変数: 実行時に
ShowFlag.ToneCurve=0を設定します。 - 後処理ボリューム: 後処理ボリュームをレベルに追加し、[Film (フィルム)] > [Tone Curve Amount (トーンカーブ量)]を[0]に設定します。
エフェクトが表示されない場合、次のことを確認してください。
- [Post Process Volume Settings(後処理ボリュームの設定)] > [Enabled(有効)]を選択したこと。
- カメラが後処理ボリュームの範囲内にあること、または[Post Process Volume Settings(後処理ボリュームの設定)] > [Infinite Extent (Unbound)(無限(制限なし))]を選択したこと。