ポストプロセスだけじゃない!HDRP Volume Framework

ボリュームフレームワークは、HDRPのさまざまなグラフィック設定を作成したり、複数の設定を切り替えたりするための仕組みです。
とてもよく考えられたシステムで、この仕組みを理解すると、ゲーム中の様々な状況に合わせたグラフィック設定を、簡単かつ意図通りにコントロールできるようになります。

ボリュームフレームワークの概要

ボリュームフレームワークでは、ボリュームというコンポーネントを持ったゲームオブジェクトによってグラフィックの設定をコントロールします。
Unity2019.4以降でHDRPの新規プロジェクトを作成した時も、テンプレートのシーンにはこのボリュームがはじめから配置されています。
これを非アクティブにすると画面全体のグラフィックが少し変化するのがわかります。

デフォルトのボリュームをオフにすると見た目が変わります

Volumeでは非常に多くの設定をコントロールできます。
目立つところではポストプロセッシングでの色調補正やエフェクトなどがありますが、それ以外にもカメラの露出や、空の見た目を変えたりシャドウや、スクリーンスペースライティングの調整など、ビジュアルにまつわる様々な設定を行う事が可能です。

今回は個々の機能にはふれません。
機能の詳細はぜひ HDRPのマニュアル をご覧ください。

基本的な使い方

ボリュームの基本的な使い方から見ていきましょう。メニューにはボリュームのプリセットがあるのでここから作成するのが一番簡単です。

プリセットにはいくつかの種類がありますが、作成後でも簡単に変更もできるので、あまり気にしなくても大丈夫です。 またカメラやキャラクターなどのゲームオブジェクトに、ボリュームコンポーネントを追加する事でも、ボリュームを扱う事ができます。

ボリュームコンポーネント自体は、モード、ブレンドディスタンス、ウェイト、プライオリティ、プロファイラーという5つの設定項目しか持っていません。

では、細かなパラメータの調整はどこで行うのでしょうか。先ほど紹介したような多彩なグラフィックスの設定は、プロファイラーにアサインされたボリュームプロファイルという独立したファイルに記録されます。この構造のおかげで、別のシーンや違う場所にあるボリュームに、同じ設定を共有する事ができます。

試しに1つプロファイルを作ってみましょう。 プロファイル設定の横にある新規ボタンを押すと新しいプロファイルが作成されます。

ボリュームにプロファイルを持たせると、Add Overrideというボタンが表示され、グラフィックスの設定を追加、調整する事ができるようになります。
ここではカラーアジャストメントとビネットを使って少し極端な見た目を作ってみました。

このように、Add Overrideで設定したい項目を追加し、それを調整するというのが、ボリュームの基本的な使い方となります。

デフォルトのボリュームとその変更方法

ところでこのプロジェクトは、シーンに存在する全てのボリュームをOFFにしても、それほどおかしな見た目にはなりません。
ボリュームで設定していないのに、空にはグラデーションがあり、HDRの露出調整もなされているように見えます。 これはHDRPに、プロジェクト全体の基礎となるグラフィックの設定が存在するからです。 この設定は 編集 > プロジェクト設定 の中の、HDRPデフォルトセッティングスから確認することができます。

このボリュームコンポーネントの箇所です。
先ほどまでのボリュームと同様に、プロファイルを使っていろいろな設定がされています。 この設定を全てオフにすると、空や露出の設定がされていない状態のシーンを見ることができますが、これを見る事自体にはあまり意味がないと思います。 つまりボリュームフレームワークとは、ボリュームを使ってこのデフォルト設定をオーバーライド、上書きする仕組み、というわけです。

グローバルボリュームとローカルボリューム

次にもう一つ、違う種類のボリュームを作りたいと思います。 ボリュームにはグローバルとローカルの2種類があり、先ほどまで使っていたのは、シーン全体に効果が掛かるグローバルボリュームです。 それに対し、シーンの特定の場所にだけ効果が現れる、ローカルボリュームを作ることもできます。ローカルボリュームはコライダーを使って領域を指定する事で、カメラがその中に入った時にだけ効果が現れるようになります。これによりフィールドの特定の場所だけの雰囲気や見た目を変える事ができます。

ローカルボリュームもゲームオブジェクトにアタッチできるので、例えば特定の敵が近くにいる時だけ画面にエフェクトが加わるような、インタラクティブな効果も簡単に作り出せます。
また変わった使い方として、このローカルボリュームをカメラオブジェクトにアタッチするという方法もあります。そうすると、シーンビューでは普通の見え方、ゲームビューではエフェクトが掛かった見え方、という状態で作業することができます。例えばDoFを強めに掛けたりして、客観的なシーンの状態が見えにくい場合などに役立つと思います。

シーンビューとゲームビューで見た目を変えた例

ボリュームの優先順位

最後に、ボリューム同士が重なった場合の、効果の現れ方についてお話します。
ボリュームはグローバル、ローカルのどちらも、シーンに複数配置する事が可能です。そういった中で、自分が望んだボリュームの影響を優先にするにはどうしたらよいでしょうか?
このような場合のために、各ボリュームにはプライオリティ、優先度を設定することができます。

これは初期設定では全て0となっていますが、この数値を変えることで、複数のボリュームが同時に有効である場合、プライオリティが高い方の設定が優先されるようになります。
グローバルボリュームのプライオリティを最高にすると、ローカルボリュームよりも効果が優先されるためエフェクトの切り替わりがなくなります。

この図のように、プロジェクトのデフォルト設定の優先度はプライオリティ0のボリュームより低く、常にボリュームによって上書きされるようになっています。

また、この優先度は、同じ設定がどちらのボリュームでも有効である場合のルールです。
別々のボリュームで設定したAddOverrideの項目が互いに違っている場合、結果にはその両方の効果が現れます。
例えばこのような設定の、プライオリティの低いボリュームがあり、それに別のプライオリティの高いボリュームを重ねた場合、結果は以下のようになります。

この仕組みは、ボリュームをレイヤー状に重ね、必要な箇所のみを上位レイヤーでコントロールする場合にとても有効なものです。
しかし、複雑に重なり合ったボリュームにおいては下の階層でどんな効果が有効になっているかを把握する事がとても大切になります。
もし下の階層で有効になっている効果を無効にしたい場合は、上位のボリュームに同じ効果をオーバーライドした上で、効果だけを無効にするか、設定をデフォルト値にするなどの方法でこれを実現します。

また、ボリュームにはウェイトというパラメータがあり、これを調整することで効果の掛かる強さをコントロールする事ができます。
ちょうど画像編集ソフトでの、レイヤーの透明度のようなイメージです。

このウェイト値はスクリプトなどからも簡単に操作できるので、ゲーム中の状況や時間の変化に応じて徐々に効果の強さを変えるような使い方も考えられます。

まとめ

ボリュームフレームワークの構造を理解すると、ゲームやリアルタイムコンテンツの中でいろいろとグラフィックを動的に変化させるアイデアが湧いて来ませんか?
フィールドの普段穏やかな場所がゲームの進行によって不気味になるとか、FPSでよくある、ダメージによって視界がモノトーンになる事なども、簡単に実現できそうです。

今回は分かりやすさから色の変化などを多く扱いましたが、ボリュームにはシャドウやライティングなどパフォーマンスに関わる設定もたくさんあるので負荷対策などにも活用できると思います。
またOverrideという仕組みによって、もとの設定を壊す事なく新しい設定が作れるので、誰でも気軽にポストエフェクトや描画設定に挑戦できるようになっています。

HDRPのボリュームフレームワーク皆さんもぜひ使ってみてください。