これは、開発者とテクニカルアーティストが Unity で High Definition Render Pipeline (HDRP) を設定して使用し、ハイエンドのグラフィックリアリズムを実現する方法を説明する一連の記事の 2 番目です。HDRP は Unity のリアルタイム レンダリングにおける技術的な飛躍を表しており、現実世界での振る舞いと同じように光を操作できます。
高級照明に関するハウツーシリーズの他の記事もぜひお読みください。
Lit Shader モードのレンダリング パスは、アンチエイリアシングを使用してレンダリングからギザギザのエッジを削除する方法に影響します。HDRP は、制作のニーズに応じて、いくつかのアンチエイリアシング手法を提供します。
マルチサンプルアンチエイリアシング
マルチサンプルアンチエイリアシング(MSAA)は、PC ゲームで一般的なアンチエイリアシング手法です。これは、個々のポリゴンのエッジを滑らかにする高品質のハードウェア方式であり、Unity のフォワード レンダリングでのみ機能します。最新の GPU は、2x、4x、8x MSAA サンプルに対応しています。
アクティブなパイプラインアセットで、「Lit Shader Mode」を「Forward Only」に設定します。続いて、「Multisample Anti-aliasing Quality」で、「MSAA 2x」、「MSAA 4x」、または「MSAA 8x」を選択します。値が大きいほどアンチエイリアシングの質が上がりますが、動作は遅くなります。これは、カメラビューでズームインしたときにより顕著になります。
MSAA には注目すべき制限がいくつかあります。
- MSAA は、シーンのジオメトリをテクスチャに保存する Deferred シェーディング G バッファと互換性がありません。したがって、ディファード シェーディングには、ポスト処理アンチエイリアシング手法の 1 つが必要です。
- MSAA はポリゴン エッジのエイリアシングのみを処理するため、鋭いスペキュラ照明が当たる特定のテクスチャやマテリアルに見られるエイリアシングを防ぐことはできません。それが問題になる場合は、MSAA を別の後処理アンチエイリアシング手法と組み合わせる必要があるかもしれません。
アンチエイリアシングをポスト処理技術として適用するには、 ポストアンチエイリアシング設定を使用します。
- Temporal Anti-aliasing (TAA) は、 過去と現在のフレームの情報を組み合わせて、現在のフレームから ジャギー を除去します。この設定を使用するためには、モーションベクトル を有効にする必要があります。TAA は一般的に優れた結果を生み出しますが、状況によってはゴースト アーティファクトが発生する可能性があります (例: 対照的な表面の前をゲーム オブジェクトが高速で移動する)。HDRP10 では、一般的な TAA アーティファクトを削減するための改善が導入されました。Unity の実装ではゴーストの発生が抑制され、シャープネスが改善されたほか、他のソリューションで見られるちらつきが防止されています。
- Fast Approximate Anti-aliasing(FXAA)は、ハイコントラストの領域間のピクセルをブレンドするスクリーンスペースアンチエイリアシング アルゴリズムです。これは、大規模な計算能力を必要としない比較的高速な手法ですが、画像全体の鮮明度が低下する可能性があります。
- Subpixel Morphological Anti-aliasing(SMAA)では、画像内の境界を検出してから、ブレンドする特定のパターンを検出します。これによって、FXAA よりシャープな結果が生成されます。フラットスタイルやカートゥーン調のスタイル、クリーンなアートスタイルに適しています。
注:ポストプロセスとマルチサンプルアンチエイリアシングを組み合わせる場合は、レンダリングコストに注意してください。いつものように、視覚的な品質とパフォーマンスのバランスをとるためにプロジェクトを最適化します。
HDRP ではボリュームフレームワークを使用します。このシステムを使用すると、シーンを分割し、カメラの位置に基づいて特定の設定や機能を有効にすることができます。たとえば、HDRP テンプレート レベルには 3 つの異なる部分が含まれており、それぞれに独自の照明設定があります。そのため、各部屋を囲むボリュームが異なります。
Volume は 、Volume コンポーネントを持つ単なるプレースホルダー オブジェクトです。ボリュームは、「GameObject > Volume」メニューから、プリセットを選択することで作成できます。それ以外の場合は、正しいコンポーネントを含む GameObject を手動で作成するだけです。
Volume コンポーネントは任意の GameObject に追加できるため、階層内で見つけるのが難しい場合があります。ライト エクスプローラー (ウィンドウ > レンダリング > ライト エクスプローラー > ボリューム) を使用すると、読み込まれたシーン内のボリュームを見つけることができます。このインターフェースを使用して手早く調整することができます。
関連するコンテキストに応じて、ボリューム コンポーネントの モードを Global または Localに設定します。
グローバル ボリュームは 境界のない「包括的な」ボリュームとして機能するため、シーン内のすべてのカメラに影響します。HDRP サンプルシーンでは、VolumeGlobal は レベル全体の HDRP 設定の全体的なベースラインを定義します。
ローカル ボリュームは 、設定が有効になる限られた領域を定義します。境界を決定するために Collider コンポーネントを使用します。FPS プレーヤー コントローラーなどの物理ボディの動きをコライダーが妨げないようにするには、Is Trigger を 有効にします。
サンプル シーン (ボリューム セクションの画像を参照) では、各部屋にはグローバル設定をオーバーライドする BoxCollider を持つローカル ボリュームがあります。
部屋 2 には、ガラスケースの横の明るい中央部分に小さな球形のボリュームがあり、部屋 3 には、入口の廊下とペンダント ライトの下の座席エリアに小さなボリュームがあります。
テンプレートでは、ローカル ボリュームによってホワイト バランス、露出、および/またはフォグが上書きされます。明示的に上書きされていないものはすべてグローバル設定に戻ります。
カメラがシーン内を移動すると、プレイヤー コントローラーがローカル ボリュームにぶつかるまでグローバル設定が有効になり、ローカル ボリュームで設定が引き継がれます。
パフォーマンスのヒント: 多数のボリュームを使用しないでください。各ボリュームの評価 (ブレンディング、空間化、オーバーライド計算など) には、ある程度の CPU コストがかかります。
ボリューム コンポーネントには実際のデータは含まれません。その代わり、ボリュームコンポーネントはボリュームプロファイルを参照します。これは、シーンをレンダリングするための HDRP 設定を含むディスク上の ScriptableObject アセットです。
新しいボリュームプロファイルを作成するには、「Profile」フィールドで、「New」または「Clone」ボタンを使用します。すでに保存されている別のプロフィールに切り替えることもできます。
ボリューム プロファイルをファイルとして使用すると、以前の設定を再利用したり、ボリューム間でプロファイルを共有したりすることが容易になります。
再生モードで音量プロファイルに加えられた変更は、そのモードを終了しても失われないことに注意してください。
各ボリュームプロファイルでは最初、一連のプロパティがデフォルト値に設定されています。値を編集するには、「ボリュームのオーバーライド 」に移動して、個々の設定をカスタマイズします。たとえば、ボリュームの フォグ、 ポストプロセス、または 露出を変更するには、 ボリューム オーバーライド を使用します。
ボリュームプロファイルを設定したら、「Add Override」をクリックし、プロファイル設定をカスタマイズします。フォグオーバーライドがどのように見えるかについては、画像の例を参照してください。
ボリューム オーバーライドの各プロパティの左側にはチェックボックスがあり、これを使用してそのプロパティを編集できます。ボックスを無効のままにすると、HDRP はボリュームのデフォルト値を使用します。ボリューム オブジェクトには複数のオーバーライドを設定できます。それぞれに必要な数のプロパティを編集します。左上の「All」または「None」のショートカットを使用すると、オンとオフを一括で切り替えることができます。
オーバーライドの追加は HDRP の重要なワークフローです。プログラミングの継承という概念を理解していれば、Volume オーバーライドも理解しやすくなります。
高レベルのボリューム設定は、低レベルのボリュームのデフォルトになります。ここで、HDRP のデフォルト設定はグローバル ボリュームに渡され、グローバル ボリュームはローカル ボリュームの「ベース」として機能します。
グローバル ボリュームは HDRP のデフォルト設定をオーバーライドし、 ローカル ボリュームは グローバル ボリュームをオーバーライドします。重複するボリュームによって発生する競合を解決するには、Priority、Weight、および Blend Distance(次のセクションで説明) を使用します。
特定のボリューム コンポーネントの現在の値をデバッグするには、 レンダリング デバッガーの [ボリューム] タブ に移動します。
完全な ボリュームオーバーライドのリスト については、HDRP ドキュメントを参照してください。
多くの場合、レベルごとに複数のボリュームが必要になるため、HDRP ではボリュームをブレンドできます。これにより、それらの間の遷移がそれほど急激ではなくなります。
実行時に、HDRP はカメラの位置を使用して、どのボリュームが HDRP 設定に影響を与えるかを判断します。
ブレンド距離は、ボリュームのコライダーの外側でフェードオンまたはフェードオフを開始する場所、またはフェードオフを開始する距離を決定します。ブレンド距離の値が 0 の場合は即時遷移を意味し、正の値はカメラが指定された範囲に入ったときにのみボリューム オーバーライドがブレンドされることを意味します。
ボリューム フレームワークは柔軟性があり、必要に応じてボリュームとオーバーライドを組み合わせることができます。同一スペース内に複数のボリュームが重複している場合、「Priority」に基づいて、優先されるボリュームが決定されます。値が大きいほど優先度が高くなります。
一般的に、推測を排除するために 優先度の 値を明示的に設定します。そうしないと、システムは作成順序を優先度の「タイブレーカー」として使用するため、予期しない結果が生じる可能性があります。
露出値を大きくするとカメラに入る光が少なくなり、より明るい状況に適しています。ここでは、晴れた日中の屋外では EV 値が 13 ~ 16 の間が適しています。対照的に、暗く月のない夜空では、EV は -3 ~ 0 の範囲で使用される場合があります。
実際のカメラの設定でいくつかの要素を変えて露出値を変更できます。
- シャッタースピード:画像センサーが光にさらされる時間
- F値:絞りまたはレンズ開口部のサイズ
- ISO:フィルム/センサーの光に対する感度
写真家の間では、これは露出の三角形と呼ばれています。Unity では、実際のカメラと同様に、これらの数値のさまざまな組み合わせを使用して同じ露出値に到達できます。HDRP は露出値を EV100で表し、感度を 100 国際標準化機構 (ISO) フィルムの感度に固定します。
上記の式は露出値を計算します。
これは 2 を底とする対数スケールであることに注意してください。露出値が 1 単位増加すると、レンズに入る光の量は半分に減少します。
HDRP を使用すると、実際の画像の露出を一致させることができます。カメラやスマートフォンでデジタル写真を撮影するだけです。画像からメタデータを取得して、f 値、シャッター速度、ISO を識別します。
式を使用して 露出値を計算します。露出オーバーライド (次のセクションを参照) で同じ値を使用すると、レンダリングされたイメージは実際の露出と一致するはずです。
レベルを照明するときに、デジタル写真を参考にすることができます。必ずしもイメージを完璧に再現することが目標ではありませんが、実際の写真に一致させることで、照明設定を推測する必要がなくなります。
HDRP では、 露出はボリュームオーバーライドです。使用可能なプロパティを表示するには、 ローカル ボリュームまたは グローバル ボリューム に追加します。
[モード] ドロップダウンで、次のいずれかを選択します。「Fixed」、「Automatic」、「Automatic Histogram」、「Curve Mapping」、「Physical Camera」
「Compensation」では、露出を変更、調整できます。これを使用して、微調整を適用し、レンダリングされたイメージをわずかに上下に「停止」することができます。
「Fixed」モード
固定モードで は 露出値を 手動で設定できます。「Fixed Exposure」スライダーの目盛りが参考になります。右側のアイコンにはプリセットのドロップダウン (例: 日光の当たるシーンの場合は 13、月のないシーンの場合は -2.5) がありますが、フィールドを任意の値に直接設定できます。
固定モードはかなりシンプルですが、あまり柔軟性がないことに注意してください。これは、ボリュームまたはシーンの照明が比較的均一で、1 つの露出値が全体にわたって機能する場合にのみ機能する傾向があります。
自動モードでは、 画面上の明るさレベルの範囲に応じて露出が動的に設定されます。これは、 人間の目が さまざまなレベルの暗さに適応し、黒として認識されるものを再定義するのと同じように機能します。
自動モードは多くの照明条件下で機能しますが、カメラをシーンの非常に暗い部分または非常に明るい部分に向けると、意図せずに画像が露出オーバーまたは露出アンダーになることもあります。露出レベルを望ましい範囲内に保つには、「Limit Min」 と 「Limit Max」 を使用します。プレイテストを行い、レベル全体を通じて制限が予想される露出範囲内にとどまっていることを確認します。次に、 測光モードと マスク オプションを組み合わせて、フレームのどの部分に自動露出を適用するかを指定します。
自動露出は 、カメラが暗さから明るさに切り替わるにつれて変化し、 速度を調整するオプションがあります。目の場合と同様に、カメラを非常に暗い場所から非常に明るい場所へ、またはその逆に移動すると、一時的に方向感覚が失われることがあります。
自動、 自動ヒストグラム、および カーブ マッピングでは 、 測光モード を使用して、露出を計算するときに使用するフレームの部分を決定します。測光モードは次のように設定できます。
- 「Average」:フレーム全体を使用して露出を測定します。
- Spot:画面の中央部のみを使用して露出を測定します。
- 「Center Weighted」:画面の中央部にあるピクセルを優先的に使用し、フレームの端に向かうにつれて使用率を減らしていきます。
- 「Mask Weighted」:提供された画像 (ウェイト テクスチャ マスク) は、露出を制御するために最も重要なピクセルを示します。
「Procedural Mask」:プロシージャルに生成されたテクスチャを基に露出を評価します。中心、半径、柔らかさのオプションを変更できます。
自動ヒストグラム モードは、自動モードをさらに進化させたものです。最終的には、画像のヒストグラムを計算し、露出を設定するときに最も暗いピクセルと最も明るいピクセルを無視します。
露出計算から非常に暗いピクセルや非常に明るいピクセルを除外することで、フレーム上に非常に明るいピクセルや暗いピクセルが現れるたびに、より安定した露出が得られる可能性があります。こうすることで、強い発光面や黒いマテリアルによって、レンダリングされた出力が露出不足になったり露出過剰になったりすることがなくなります。
自動ヒストグラム モード の ヒストグラム パーセンテージ設定 を使用して、指定されたパーセンテージの範囲外のヒストグラム内のすべてのものを破棄します (ヒストグラムの左端と右端の部分から最も明るいピクセルと最も暗いピクセルを切り取ることを想像してください)。次に、 カーブの再マッピング を使用して露出カーブを再マッピングします (詳細は次のセクションを参照してください)。
カーブ マッピングは自動モードの別のバリエーションです。
カーブ マッピング モードでは、カーブの x 軸は現在の露出を表し、y 軸は目標露出を表します。露出曲線を再マッピングすると精度を高めることができます。
写真撮影に慣れている人にとっては、 物理カメラ モードは カメラ パラメータの設定に役立つかもしれません。
Exposure オーバーライドの「Mode」を「Physical Camera」に切り替えてから、「Main Camera」を確認します。そこから、物理カメラを有効にすることができます。インスペクターに表示されるプロパティについては画像を参照してください。
露出に重要なのは 、物理カメラの下にある ISO(感度)、 絞り (または f 値)、 シャッター速度です。参照写真を一致させる場合は、画像の Exif データから正しい設定をコピーします。または、こちらの表を参考にすると、F 値とシャッタースピードを基に露出値を推測できます。
露出とは無関係ですが、「Physical Camera」のその他のプロパティも、現実世界のカメラの属性に合わせる助けになります。
たとえば、Unity(および他の多数の 3D アプリケーション)では通常、有効視野(FOV)を使用して、カメラがワールド内を一度に撮影できる範囲を決定します。しかし、実際のカメラでは、有効視野はセンサーのサイズとレンズの焦点距離によって決まります。
直接有効視野を設定するのではなく、「Physical Camera」の設定を使用すると、実際のカメラのデータの「Sensor Type」、「Sensor Size、「Focal Length」を入力できます。Unity は対応する視野の値を自動的に計算します。
実際の写真参照と一致させようとするときは、画像ファイルに含まれるカメラのメタデータに依存します。Windows と macOS はどちらもデジタル画像から Exif データを読み取ることができます。その後、対応するフィールドを仮想カメラにコピーできます。
メタデータからカメラのメーカーとモデルを導き出したら、製造元の Web サイトで正確なセンサー寸法を検索する必要がある場合があることに注意してください。この記事には、 一般的なイメージセンサーのフォーマットの概要が記載されています。下部のパラメータのいくつかは被写界深度ボリュームに影響します。
Unity 2021 LTS では、カメラのインスペクターから 焦点距離 を制御できます。「Depth of Field」ボリュームコンポーネントから、「Focus Mode.」と「Focus Distance Mode」を「Physical Camera」にセットします。
ブレード数、 曲率、 バレルクリッピング を使用して、カメラ絞りの形状を変更します。これは、「Depth of Field」ボリュームコンポーネントによって生じる「ボケ」の見え方に影響します。