【Unity】HDRってなんやねーん!という人のための解説
- 2020.01.24
- PostProcessing
- HDR, Unity, ポストプロセシング
Unityでは色の設定で「HDR」の文字がついている場合があります。この「HDR」ってよく分からないけど、なんだか「Intensity」の設定項目もあるし、光の強度でも表しているのかな? なんて感じでさらっと流しているあなたのために徹底解説します。
環境
macOS 10.15 Catalina
Unity2019.2.9f1
Unity Hub 2.2.2
Post Processing 2.1.7
「HDR」とは
「HDR」は「High Dynamic Range(ハイ ダイナミック レンジ)」の略で、従来の映像や画像よりも明るさを表現できる範囲を広げたものです。「従来の映像や画像」の表現は「SDR」、すなわち「Standard Dynamic Range(スタンダード ダイナミック レンジ)」と呼ばれています。
通常の表現であるSDRだと、明るすぎるところは白飛びし、暗い部分では黒つぶれが起こることがあります。こうした部分についても、色の階調を表現できるようになっているのがHDRです。
白飛びについて
白飛びとは、画像が明るくなりすぎてしまい、白くなってしまうこと。この言葉は写真を嗜んでいる人なら聞き覚えがあるかもしれません。
例えば青空を撮影したとき、太陽の光が強すぎて太陽周辺が真っ白になってしまうことがあります。本来なら太陽の周りは青空であるはずですが、情報が失われてしまうんですね。
Unityで白飛びが起こる場面というと、ライトの強度(Intensity)を上げた時によく起こります。
例えば以下の画像では、意図的にライトの強度を上げています。真ん中の発光している球体が強く光っているせいで、球体と地面との境目がよく分からなくなっています。隣の球体も真っ白になってしまっている部分があります。右のトーチでも光が漏れ出していて台座のフチが分からない状態です。
HDRでトーンマッピング(ディスプレイで表示できるように輝度をマッピングし直すこと)を使うことで、光が強くて白飛びしてしまっていた部分が補正されました。上の画像と見比べると、明るい部分でもただ単に白飛びするのではなく、色がちゃんと表現されています。分かりやすいのは左側の球体と、右側の台座でしょうか。
黒つぶれについて
黒つぶれとは、白飛びとは逆に画像が暗すぎて暗い部分の情報が失われてしまうこと。こちらも写真を嗜んでいる人にはおなじみの言葉かも。
暗い部屋を撮影したときは、室内の様子は真っ黒になって何が何だか分からないようになります。部屋の窓から太陽の光が差し込んでいるなどコントラストが高い場面で光の方に合わせると、暗い部分の情報が失われてただの黒一色になってしまいます。
Unityの場合はライトが当たっていない部分が真っ暗になってしまうことがあります。ただ写真のように情報が欠落した画像に対して補正を行うことは少なくて、ライトの強度を上げれば光が届いた状態で再計算して描画してくれるのでこちらはあまり気にすることはないかもしれません。
以下の画像は黒つぶれの例です。キャンドルの上部は壁なのですが、光の量が足りていないので黒くなっています。
こちらはライトを追加するか、ポストプロセシングを使って明るくすると暗い部分も描画されます。明るくする時には白飛びに気をつけましょう。
UnityでHDRを扱う
UnityでHDRを扱うには、ポストプロセシング(Post-Processing)を使用します。
ポストプロセシングについては以下のページで使い方を解説しているので、こちらをご覧ください。
ポストプロセシングでは「Color Grading(カラーグレーディング)」のエフェクトを使います。これは色調を補正するエフェクトです。色空間をリニアに変更する必要があるので、この手順も上記の記事をご参照くださいな。
通常のSDRでは赤、緑、青の値が0から1の浮動小数点による値で表現されます。HDRの場合はこの範囲を超えた値を保持することができますが、最終的にディスプレイに画像を表示する時には0から1の値にする必要があります。だから、範囲外の値をマッピングする必要があるんですね。
表現できる範囲を超えたから全部白! になるのではなく、どれくらい超えたかを計算して、それを元に「この部分はもうちょっと明るさを落として色を表現しよう」みたいに計算してくれています。この機能はトーンマッピングと呼ばれており、「Color Grading」のエフェクトの中で設定することができます。
カメラでの設定
HDRで作業するためには「Camera」コンポーネントで「HDR」の項目をOffから [Use Graphics Settings] に切り替える必要があります。
「Graphics Settings」はProject Settingsで確認することができます。画面上部のツールバーから [Edit] -> [Project Settings] を開き、「Graphics」タブを確認するとHDRを使うかどうかの設定を確認することができます。PC向けの場合、デフォルトではTier1, 2, 3全てでHDRを使うようになっています。Tier(層)は端末の性能に応じたシェーダーの処理設定のまとまりです。
エフェクトの追加
シーン内に作成した「Post-Processing Volume」のオブジェクトに「Color Grading」のエフェクトを追加します。[Add effect…] のボタンをクリックし、[Unity] -> [Color Grading] を選択します。
「Color Grading」のエフェクトは以下のような設定項目があります。グレーアウトされている項目はデフォルトの設定で、変更する場合は左側にあるチェックを入れます。
例えば以下の画像であればトーンマッピングの「Mode」の値をデフォルトの「None」から [Neutral] に変更しています。
トーンマッピングのモードについて
トーンマッピングのモードは4つ選択肢があります。
None
トーンマッピングを行わないモードです。(デフォルト)
Neutral
Neutral(ニュートラル)は色相や彩度への変化を最小限に抑えたトーンマッピングです。全体的にほわっとした感じのマッピングになります。上の方で紹介したこの画像はNeutralでトーンマッピングしています。
ACES
ACES(エイスズ、エイセズ)は映画などで使われるトーンマッピングで、Neutralよりはコントラストが強めです。見た目も映画のような感じになります。ACESはAcademy Color Encoding Systemの頭文字を取っており、アカデミー賞で有名な映画芸術科学アカデミーが開発を後援しています。
Neutralと比べるとほわっとした感じではなく、明るいところが強調されるような映像になります。右上の家を見ると、上の画像よりも暗くなっていますね。これによって画面手前の光っているオブジェクトたちが目立つようになっています。
Custom
自分でトーンマッピングの設定を行うこともできます。……が、ゲームの雰囲気に合わせてNeutralかACESのどちらかを選んでおけば大丈夫だと思います。
Bloomと相性がいい
「Color Grading」のエフェクトは「Bloom」のエフェクトと相性がいいのです。「Bloom」のエフェクトでは、シーン内のライトや発光体から光がにじみ出ているような効果が追加されます。Bloomは「咲く」という意味の言葉なので、まさに光が咲き誇るような演出ができます。
「光っている感」を出すためには、他のピクセルに対してライトの色が影響するようにすると良いのですが、「Bloom」ではこれをやってくれるんです。
実は上で紹介していた画像でもしれっと「Bloom」のエフェクトを追加していました。溢れ出す光の色も決められるので、「Color」の項目で設定すると良いでしょう。「Intensity」では光の強度を決められますが、トーンマッピングを設定しておかないと画面が簡単に白飛びするので、「Color Grading」のエフェクトとペアで使うイメージで良いと思います。
「Bloom」の色を設定する場合は強度(Intensity)の設定があるカラーピッカーが表示されます。この中で色と光の強さを決めます。カラーピッカーの中のIntensityを上げる場合は、「Bloom」のIntensityを下げて調整します。両方が大きくなるとトーンマッピングを設定していても画面が真っ白になるのでご注意を。
Bloomについてもうちょっと知りたい場合は以下の記事もご覧くださいな。
まとめ
HDRの解説と、UnityでHDRを扱う方法を解説しました。半分くらいポストプロセシングの話だったような……? でも関係しているのでお許しを。
HDRは広い範囲の明るさの幅を持つことができる技術で、色の情報が失われてしまう白飛び、黒つぶれを防ぐことでより現実味のある映像を作り出すことができます。
ゲームを遊ぶ環境にもよりますが、PC向けやある程度性能の良い端末向けのゲームであれば、ポストプロセシングを使うことで映像が綺麗になるため、HDRを使った表現の導入を検討してみてください。
以下のページでポストプロセシングのエフェクト一覧をまとめてあるので、もしよかったらこちらもご参照ください。
ゲーム開発の攻略チャートを作りました!
-
前の記事
【Unity】ポストプロセシング(Post-Processing)を使ってプロ級の画面に 2020.01.23
-
次の記事
【Unity】世界が変わるBloom(ブルーム)の使い方【Post Processing】 2020.01.25
コメントを書く