Search Unity

Blacksmithの企画初期段階で、組み込みのフォグ機能よりもよいディティールが出せて制御も優れた大気散乱(Atmospheric Scattering)表現のソリューションが欲しいということが分かっていました。特に、映画にあるような広大な景観を撮影したときに出る大気遠近法の表現が欲しかったのです。

atmospherics_02

このプロジェクトで散乱表現の手法について検討を重ねた結果、まずはいくつかの西田友是博士の論文に記されていたシミュレーションモデルを実装して試してみることにしました。いくつかの実験と、複数のことなるショットを描画するというプロトタイピングの結果、このショートフィルム用にはコストが高く、美術的なコントロールが効くモデルをそれぞれのショットで使うという結論になりました。わたしたちは物理モデル上の重要な要素をより正確に再現出来つつ、必要となったときにはそのルールを破れるようなやり方を求めていました。さらに、ランタイムパフォーマンスに巨大な影響を与えないことも必要で、できればピクセル単位ではなく頂点単位で大体の計算処理ができる方法を探していました。

わたしたちは物理モデルからレイリー散乱とミー散乱を組み合わせた効果をエミュレートできることをゴールに設定しました。さらに3つめの要素としてさまざまな低高度での散乱表現を組み込み、これをまとめて「高度散乱(height scattering)」と名付けました。もう一つの物理ベースモデルからの逸脱点は、空と雲をプロシージャルに生成するかわりに、HDRの空テクスチャーを使い続けるという選択でした。この選択のデメリットは時間に対する正確な空の表現をしようとすると大変だということですが、これはBlacksmithでは必要ないので問題にならず、この選択のメリットは空に対して完全な美術的制御が保てるという点だったので、そのような選択を行いました。

レイリー散乱

大気中における太陽光のレイリー散乱は、日中空があざやかな青になり、日の出と日没のときに空と太陽を赤く染める原因です。

私たちのエミュレーション方法では、太陽自体については処理を省き、太陽光の入出による光の散乱で生成された色と光の消滅のモデル化にのみフォーカスすることにしました。太陽の描写自体は空テクスチャーか、ミー散乱の一部として処理するか、太陽のフレアスプライトを使うか、その組み合わせによって追加できます。この方法の最も純粋な核は、私たちのレイリー散乱の密度が、レイリー位相関数で転調された、美化用の指数関数に落とし込まれるという点です。しかしながら、わたしたちはデータに対していくつかの制御の追加を行い、このモデルにデータを追加したり、モデルからデータを取り出したりといった処理を行います。私たちは大気を通る異なる波長の光をそれぞれモデル化しているわけではないので、計算する密度はスカラー値になります。HDRカラーグラデーションを使って地平線や天頂に対する異なる色相の入拡散光を実現し、距離に応答する関数によって最終的な色彩を構成しています。

scatter_Rayleigh
異なる散乱設定におけるレイリー散乱のもたらす効果。

ミー散乱

太陽光の大気中のミー散乱は太陽のまわりに出来る明るい円環や、雲の灰色〜白の見た目、汚れた都市の空気に見えるかすみを作るのに貢献します。レイリー散乱は一様に光を散乱させるのに対して、ミー散乱は前方(forward)への強い指向性を持っています。

私たちのエミュレーションでは、ミー散乱を太陽のまわりに出る霞や円光のプライマリーな表現として使いました。すると、レイリー散乱で太陽を無視していることについて、ミー散乱の効果がほとんどのケースで埋め合わせてくれるのです。技術的には私たちのレイリー散乱とミー散乱の関数はとても似ていて、出力に使われる位相関数だけが大きく違っています。他の多くの実装と同じく、私たちもHenyey-Greenstein 散乱関数を異方性(anisotropy)やミー散乱の前方指向性(forward directionality)の制御に利用しています。

scatter_Mie
異なる設定下でのミー散乱の効果。

論文を読まれた方々からは、それぞれのエミュレーションに対してわたしたちが一定の「自由」を得るようにした上でもなお「レイリー散乱」や「ミー散乱」といった名前付けを継承したことを笑われるかもしれません。私たちは早期から人々が「空の散乱」に対してレイリーと呼んだり「太陽のかすみ」に対してミーと呼ぶことを発見したので、実装したモデルが物理モデルから簡略化されたあとでも同じ名前を維持することにしました。

高度散乱

高度による散乱の要素は、放射フォグ、地表のもや、低く横たわる雲などの、さまざまな低高度の散乱効果の寄せ集めです。

私たちの高度散乱(Height Scattering)の実装はかなり単純です。高さの密度は定義済の海抜と高さの減衰によって計算されます。そしてこれを距離によって指数的な密度にスケールし、全体を任意の色で色づけします。

scatter_Height
異なる散乱設定下での高度散乱の効果。

散乱オクルージョン

わたしたちの散乱効果は主に観測者に対して向かう日光・観測者から遠ざかる日光・そして観測者と太陽のあいだで日光を吸収するパーティクルによって起きるものなので、なんらかの物体が日光を遮っている場合には、何かが起きるべきと考えた方がよいでしょう。

そのようなケースを処理するために、ディレクショナルライトのカスケードされたシャドウマップに対してレイマーチングを行い、レイに沿ってオクルージョンの量を累算し、ダウンスケールしたオフスクリーンバッファに保存しました。散乱効果を描画ピクセルに適用するとき、このオクルージョンマップをエッジを保存するフィルターでアップスケールし、これと組み合わせて最終的なピクセルの色を決定します。この合成処理のステージではちょっとした問題が発生しました。私たちの手法は1回の拡散処理しかサポートしていないので、単純に入拡散光を全部マスクして外すと、非常に暗く不自然な絵になってしまうのです。さらに、私たちは自分たちの手法をより複雑でコストの高い複数の拡散処理をサポートする方向には拡張したくありませんでした。最終的に、この問題の解決策は特定の割合の拡散を直接散乱ではなく間接散乱として扱うよう明示的に指定できる「間接係数」を発明することでした。

scatter_Occlusion
異なる散乱設定下でのバイアスなしのオクルージョン。

全てを一つに組み合わせる

さて、もう残っているのはこの異なる要素を組み合わせて最終的な画像を作成することだけです。レイリー散乱、ミー散乱、高度散乱の要素を組み合わせると、異なる散乱色のよいコンポジションから始めることができます。

scatter_Scattering
レイリー散乱、ミー散乱、高度散乱の効果を組み合わせた結果。

次に、オクルージョンバッファを確実に組み合わせて良い効果を出す必要があります。私たちはそれぞれ異なる強度パラメーターを使って、直接散乱・間接散乱・雲と空の散乱に対してオクルージョンを微調整しています。

scatter_OccludedScattering
組み合わされ、オクルージョンされた散乱効果。

最後は、散乱と描画イメージを合成するだけです。送信されたイメージを累算された光の消滅量の合計で暗くし、入散乱光の合計で明るくします。これによって例にあるシーンのようなコンポジションの結果を得ることが出来ます。

scatter_None
最終的なコンポジション。

遊んでみましょう!

私たちは大気散乱表現の部分だけを別のプロジェクトに抽出し、アセットストアで入手できるようにしました。このプロジェクトには、手法を実現する全てのコードとシェーダーだけでなく、この記事の絵を実現するすべての設定プリセットが含まれています。設定オプションの詳細と意味はReadmeに書いてありますので、こちらも忘れずにチェックしてくださいね。

参考文献:
[1]: Display of The Earth Taking into account Atmospheric Scattering
http://nishitalab.org/user/nis/cdrom/sig93_nis.pdf

[1]: Display Method of the Sky Color Taking into Account Multiple Scattering
http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.75.5595&rep=rep1&type=pdf

[1]: Display of Clouds Taking into Account Multiple Anisotropic Scattering and Sky Light
http://www.researchgate.net/publication/220720838_Display_of_Clouds_Taking_into_Account_Multiple_Anisotropic_Scattering_and_Sky_Light

HDRの空テクスチャーはNoEmotionHDRs (Peter Sanitra) / CC BY-ND 4.0 から改変なしで利用しました。

10 コメント

コメントの配信登録

コメント受付を終了しました。

  1. Rubén García

    7月 17, 2015 1:32 pm

    Have you noticed that using Unique Shadows ( Blacksmith asset ) disables Atmospheric Scattering Occlusion while entering play mode? (using Atmospheric Scattering in Deffered mode, with the post process script attached to the camera ). Is this a known bug?

    1. Rubén García

      7月 17, 2015 1:42 pm

      I have noticed that this bug only occurs if the “Use Scene Capture” of unitque shadow script is active.

  2. hi

    unity 5 has two deferred rendering path mode: deferred(not sure this is traditional) and legacy deferred(light prepass),
    i found that atmospheric effect can work on legacy deferred and forward but switch to deferred
    it doesn’t work.

    1. hi sorry
      i know how to do it in deferred. just add deferred script to camera

      thanks

  3. I imported the Blacksmith scene and I see this huge object called big_bad_sphere. When I turn it off and on the skybox changes, and I can’t move outside of it in the editor.

    It seems to affect atmospheric scattering somehow. Can you explain this object in detail as well?

    1. Torbjorn Laedre

      6月 30, 2015 11:56 pm

      Hi Glenn!

      If you get the atmospherics example project linked in this post, this and quite a bit more is explained in the included readme file.

  4. Rodrigo Medeiros

    6月 26, 2015 7:26 pm

    Hello friends!!!

    I have problems related to the Atmospheric Scattering. Added the asset in a clean design, but when I put the package on it, the image is all pink, it simply does not render and does not show any error!

    I’m using version 5.1.1, the my PC settings are:
    Intel Core i7, 8GB RAM, 1GB Nvidia 630m.

    1. Torbjorn Laedre

      6月 27, 2015 10:51 pm

      Hi Rodrigo!

      Unfortunately, these releases uncovered an issue affecting some users. There’s a fix in the Unity 5.1.1p2 patch release which is available now.

      To fix the ‘everything pink’ issue in some of the Blacksmith packages, please install this patch release and then reimport the failing shaders or the entire project.

  5. Hello, Unity!
    Is this Atmospheric Scattering solution works only with forward rendering path?

    1. Torbjorn Laedre

      6月 24, 2015 5:28 pm

      No, it also works in deferred by applying scattering to the opaque parts in a custom image effect. (the translucent objects and the sky are always rendered as forward)