Physically Based Sky
Physically Based Sky (物理ベースのスカイ) は、高度と関連して指数関数的に密度が減少する 2 部構成の大気を持つ、球体惑星の空をシミュレーションします。つまり、海抜が高いほど大気の密度は少なくなります。このスカイタイプに関する情報は、実装詳細 を参照してください。
シミュレーションは事前プロセスとして実行し、つまり各フレームごとではなく、一度だけ実行します。シミュレーションはライトのあらゆる組み合わせの大気散乱とビューアングルを評価してから、その結果をいくつかの 3D テクスチャに保存し、Unity はランタイムにリサンプルします。事前計算はシーンに依存せず、Physically Based Sky の設定のみに依存します。
Physically Based Sky の大気は、2 種類のパーティクルで成り立ちます。
- レイリー散乱 (Rayleigh scattering) を持つ空中粒子。
- 異方性 ミー散乱 (Mie scattering) を持つエアロゾル粒子。エアロゾルは大気汚染、高さフォグ、または霧に使うことができます。
Physically Based Sky は日中と夜の両方の空をシミュレーションすることができます。日中の時間は、追加の負荷なくランタイムに任意に変更することが可能です。次の画像は、Unity の Fontainebleau デモにおける物理ベーススカイを示しています。Fontainebleau デモに関する詳細と、デモをダウンロードして利用する方法については、 https://github.com/Unity-Technologies/FontainebleauDemo を参照してください。なお、利用できる Fontainebleau デモは、2019.3 バージョンの Physically Based Sky の日中設定のみを使用しています。
Physically Based Sky の使用
Physically Based Sky は Volume フレームワークを使います。Physically Based Sky プロパティーを有効化し変更するには、シーンで Physically Based Sky オーバーライドを Volume に追加します。Physically Based Sky を Volume に追加する手順は以下の通りです。
- シーンまたは Hierarchy ビューで、Volume コンポーネントを含むゲームオブジェクトを選択し、Inspector で表示します。
- Inspector で Add Override > Sky へ行き、Physically Based Sky を選択します。
- シーンにディレクショナル ライト が含まれていない場合は作成してください (メニュー: GameObject > Light > Directional Light)。物理的に正確な結果を得るためには、ライトの強度を 130,000 lux に設定します。
次に Volume が Physically Based Sky を使うように設定します。Visual Environment オーバーライドは、Volume が使うスカイタイプを制御します。Visual Environment オーバーライドは、Sky セクションへ行き Type を Physically Based Sky に設定します。これで HDRP は Volume が影響するすべてのカメラに対して Physically Based Sky をレンダリングします。
大気がどの程度ライトを減衰させるかは、大気中の空気とエアゾル粒子 (関与媒体) の両方の密度を変更して変えることができます。また、エアゾルを使ってリアルワールドの汚染やフォグをシミュレーションすることもできます。
ノート: Unity が Physically Based Sky を初期化する際、リソース負荷が大きい操作を実行するため、プロジェクトのフレーム率が数フレーム分落ちます。Unity が操作を完了すると、キャッシュにデータを保存して、Unity が次回 Volume を初期化する際にアクセスします。ただし、異なるプロパティーを持つ 2 つの Physically Based Sky があり、その 2 つの間で切り替えをする場合に、このフレームドロップを経験する場合があります。
API
ランタイム中このオーバーライドにアクセスし制御するためには、Volume スクリプティング API を使用します。Volume システムの仕組みにより、プロパティーは標準 Unity コンポーネントとは異なる方法で編集されます。また、各プロパティーに overrideState があるなど、他にも注意する点があります。これは Volume システムが、設定したプロパティー値と Volume Profile に保存されているデフォルト値のうち、どちらを使うかを指示します。API を正しい利用法についての詳細は、 Volume スクリプティング API を参照してください。
プロパティー
Volume コンポーネントのオーバーライドのプロパティーを編集するには、プロパティーの左にあるチェックボックスを有効にします。これにより HDRP も Volume コンポーネントに対して、デフォルト値ではなく特定されたプロパティー値を使うことになります。チェックボックスを無効にすると、HDRP は設定されたプロパティーを無視し、Volume のデフォルト値を代わりに使います。
Model
プロパティー | 説明 |
---|---|
Type | HDRP が Inspector を簡素化するために使うプリセットを示します。Earth (Simple) または Earth (Advanced) を選択すると、Inspector は適したプロパティーのみを表示して地球をシミュレーションします。 |
Planet
プロパティー | 説明 |
---|---|
Spherical Mode | Spherical Mode を有効化します。球面モードでは、惑星の位置を特定することができます。そうでなければ惑星は常に、ワールド空間 X-Z 面でカメラの下に位置します。 |
Planetary Radius | 惑星の半径をメートル単位で表します。半径とは、惑星の中心から海面までの距離のことです。球面モード でのみ利用可能です。 |
Planet Center Position | メートル単位で表される、惑星中心のワールド空間位置です。事前計算には影響しません。Spherical Mode でのみ利用可能です。 |
Sea Level | メートル単位で表される、惑星の海面のワールド空間 Y 座標です。Spherical Mode でのみ利用可能です。 |
Planet Rotation | 惑星の方向性です。 |
Ground Color Texture | 惑星のサーフェスを表現するテクスチャを特定します。 |
Ground Tint | HDRP が Ground Color Texture に色付けするために使うカラーを特定します。 |
Ground Emission Texture | 惑星のサーフェスのエミッシブエリアを表現するテクスチャを特定します。 |
Ground Emission Multiplier | HDRP が Ground Emission Texture に適用する乗数です。 |
Space
このセクションを表示するためには、Type を Earth (Advanced) または Custom Planet に設定します。
プロパティー | 説明 |
---|---|
Space Rotation | スペースの方向性です。 |
Space Emission Texture | スペースのエミッシブエリアを表現するテクスチャを特定します。 |
Space Emission Multiplier | HDRP が Space Emission Texture に適用する乗数です。 |
Air
このセクションを表示するためには、Type を Custom Planet に設定します。
プロパティー | 説明 |
---|---|
Air Maximum Altitude | メートル単位で表す、空中粒子で構成される大気レイヤーの海面からの深度です。ハイトベースの密度減退の割合を制御します。HDRP はこの高度における空気密度は無視できるほど小さいと仮定します。 |
Air Density R | 観察者の真上の空の地点における (天頂)、空気の赤いカラーチャンネル不透明度です。天頂の空気の色に直接影響します。 |
Air Density G | 観察者の真上の空の地点における (天頂)、空気の緑のカラーチャンネル不透明度です。天頂の空気の色に直接影響します。 |
Air Density B | 観察者の真上の空の地点における (天頂)、空気の青いカラーチャンネル不透明度です。天頂の空気の色に直接影響します。 |
Air Tint | 空気粒子の単一散乱アルベド (カラーチャンネルごと) です。値が 0 の場合は粒子を吸収し、値が 1 の場合は散乱させます。 |
Aerosols
プロパティー | 説明 |
---|---|
Aerosol Maximum Altitude | メートル単位で表す、エアロゾル粒子で構成される大気レイヤーの海面からの深度です。ハイトベースの密度減退の割合を制御します。HDRP はこの高度における空気密度は無視できるほど小さいと仮定します。 |
Aerosol Density | 観察者の真上の空の地点における (天頂)、エアロゾルの不透明度です。天頂のエアロゾルの色に直接影響します。 |
Aerosol Tint | エアロゾル粒子の単一散乱アルベド (カラーチャンネルごと) です。値が 0 の場合は粒子を吸収し、値が 1 の場合は散乱させます。 |
Aerosol Anisotropy | 異方性の方向を特定します。 • 前方散乱は、この値を 1 に設定します。 • この値を 0 に設定すると、異方性をほぼ等方性にします。 • 後方散乱は、この値を -1 に設定します。 異方性の値が高い場合 • 光経路とビュー方向が並んでいる場合、明るい大気/フォグエフェクトになります。 • 並んでいない場合は、薄暗い大気/フォグエフェクトになります。 • 異方性が 0 の場合、大気およびフォグは、ビュー方向に関わらず同じように見えます。 |
Artistic Overrides
プロパティー | 説明 |
---|---|
Color Saturation | 空の色の飽和度を制御します |
Alpha Saturation | 空の不透明度の飽和度を制御します。 |
Alpha Multiplier | HDRP が空の不透明度に適用する乗数です。 |
Horizon Tint | HDRP が水平線で空に色付けするために使うカラーを特定します。 |
Horizon Zenith Shift | HDRP が Horizon Tint と Zenith Tint をどのようにブレンドするかを制御します。これを -1 に設定すると、Zenith Tint は水平線まで下に拡大します。1 に設定すると、Horizon Tint が天頂まで上に拡大します。 |
Zenith Tint | HDRP が観察者の真上の空の地点 (天頂) に色付けするために使うカラーを特定します。 |
Miscellaneous
プロパティー | 説明 |
---|---|
Number Of Bounces | 散乱の事例数です。これは空のビジュアルクオリティーを上げますが、事前計算時間も増えます。 |
Intensity Mode | ドロップダウンから HDRP がスカイの強度を計算するために使うメソッドを選択します。 • Exposure: HDRP は EV100 内の露出値から強度を計算します。 • Multiplier: HDRP はフラット乗数から強度を計算します。 |
- Exposure | HDRP が環境光としてシーンに適用する露出です。HDRP は Exposure 値の累乗を使って、シーンの環境光を計算します。 |
- Multiplier | HDRP が環境光としてシーンに適用する乗数です。HDRP はシーンの環境光をこの値で乗算します。このプロパティーを表示するには、Intensity Mode を Multiplier に設定します。 |
Update Mode | HDRP がスカイ環境を (アンビエントおよびリフレクションプローブを使って) 更新する割合です。 • On Changed: HDRP はスカイプロパティーの 1 つが変更されたときにスカイ環境を更新します。 • On Demand: HDRP はスクリプトからのスカイ環境更新が手動で呼び出されるまで待機します。 • Realtime: HDRP は Update Period に定義される一定間隔でスカイ環境を更新します。 |
- Update Period | HDRP がスカイ環境を更新する秒単位の期間です。値を 0 に設定すると、HDRP は各フレームでスカイ環境を更新します。このプロパティーは Update Mode を Realtime に設定したときのみ表示されます。 |
Include Sun In Baking | スカイに生成されたライトとリフレクションプローブに太陽の円盤が含まれるかを指示します。これが有用である理由については、環境ライティング を参照してください。 |
実装の詳細
このスカイタイプは 事前計算された大気散乱 (Bruneton and Neyret, 2008) の文献で概説されているメソッドの、実用的な実装です。
この技法は、常に惑星のサーフェスの上からシーンを見ているものと仮定します。つまり、カメラが惑星のサーフェスの下にある場合、スカイはカメラが地上にあるかのようにレンダリングします。惑星のサーフェスの位置は、Spherical Mode が有効か無効かによって左右されます。
Spherical Modeを有効にするとPlanetary Radius および Planet Center Position プロパティーはサーフェスの位置を定義します。このモードでは、Planet Center Position で設定された位置から離れた Planetary Radius で設定された距離にあります。
- そうでなければ Sea Level プロパティーがサーフェスの位置を定義します。このモードでは、サーフェスが無限に XZ 面上で伸縮し、Sea Level がワールド空間のハイトを設定します。
いずれのモードにおいても、デフォルト値によりシーンの惑星のサーフェスは Y 軸で 0 になります。Spherical Mode のデフォルト値は地球をシミュレーションするため半径は非常に大きく、シーン環境を作成する際はサーフェスは平らなものとして考慮できます。シーン環境のエリアの一部を現在のサーフェスの高さよりも下げたい場合は、シーン環境を垂直にオフセットして、最も低いエリアが Y 軸の 0 以上になるようにするか、またはサーフェスの高さを減らします。後者の手順は以下の通りです。
Spherical Mode の場合は、Planetary Radius を減らすか、または Planet Center Position を下に移動させます。
Spherical Mode 出ない場合は、Sea Level を下げます。
参考文献
- Bruneton, Eric, and Fabrice Neyret. 2008. “Precomputed Atmospheric Scattering.” Computer Graphics Forum 27, no. 4 (2008): 1079–86. https://doi.org/10.1111/j.1467-8659.2008.01245.x.