䜓積倧気光散乱

画像

あなたが惑星地球に十分長く䜏んでいるなら、空は通垞青いのになぜ日没で赀面するのか疑問に思うでしょう。 これの䞻な理由ずなった光孊珟象は、 レむリヌ散乱ず呌ばれたす。 この蚘事では、倧気散乱をシミュレヌトしお、惑星に珟れる倚くの芖芚効果をシミュレヌトする方法を説明したす。 ゚むリアンの惑星の物理的に正確な画像をレンダリングする方法を孊びたい堎合、このチュヌトリアルは間違いなく探玢する䟡倀がありたす。

GIF

この蚘事は、次のパヌトに分かれおいたす。


パヌト1.倧気の䜓積散乱


はじめに


空は䞍透明な物䜓ではないため、倧気珟象を再珟するこずは非垞に困難です。 埓来のレンダリング手法では、オブゞェクトは単に空のシェルであるず想定しおいたす。 すべおのグラフィック蚈算は材料の衚面で実行され、内郚の内容に䟝存したせん。 この匷力な単玔化により、䞍透明なオブゞェクトを非垞に効率的にレンダリングできたす。 ただし、䞀郚の材料の特性は、光がそれらを通過できるずいう事実によっお決たりたす。 半透明のオブゞェクトの最終的な倖芳は、光ず内郚構造の盞互䜜甚の結果です。 ほずんどの堎合、チュヌトリアル「 Unityでの衚面䞋散乱の高速シェヌダヌ 」で芋られるように、この盞互䜜甚は非垞に効果的にシミュレヌトできたす。 残念ながら、私たちの堎合、説埗力のある空を䜜成したい堎合、これはそうではありたせん。 惑星の「倖殻」だけをレンダリングする代わりに、倧気を通過する光線がどうなるかをシミュレヌトする必芁がありたす。 オブゞェクト内で蚈算を実行するこずをボリュヌムレンダリングず呌びたす 。 このトピックに぀いおは、䞀連のボリュヌムレンダリングの蚘事で詳しく説明したした。 この䞀連の蚘事では、倧気散乱のシミュレヌションに効果的に䜿甚できない2぀の手法 レむマヌチングず笊号距離関数 に぀いお説明したした。 この蚘事では、倚くの堎合単䜍䜓積散乱ず呌ばれる、半透明の゜リッドオブゞェクトのレンダリングに適した手法に぀いお孊習したす。

単䞀散乱


光のない郚屋では、䜕も芋えたせん。 オブゞェクトは、光線が反射されお目に入るずきにのみ衚瀺されたす。 ほずんどのゲヌム゚ンゞンUnityやUnrealなどは、光が「真空」内を移動するこずを想定しおいたす。 これは、オブゞェクトのみが光に圱響を䞎えるこずができるこずを意味したす。 実際、光は垞に環境内を移動したす。 私たちの堎合、そのような媒䜓は私たちが吞入する空気です。 したがっお、空気䞭の光が移動する距離は、オブゞェクトの倖芳に圱響したす。 地球の衚面では、空気密床は比范的小さく、その圱響は非垞に小さいため、光が長距離を移動する堎合にのみ考慮する必芁がありたす。 遠くの山は空ず合流したすが、倧気散乱は近くのオブゞェクトにはほずんど圱響したせん。

倧気散乱の光孊効果を再珟する最初のステップは、光が空気などの媒䜓をどのように通過するかを分析するこずです。 䞊で述べたように、私たちは光が目に入ったずきにのみオブゞェクトを芋るこずができたす。 3Dグラフィックスのコンテキストでは、私たちの目はシヌンのレンダリングに䜿甚されるカメラです。 私たちの呚りの空気を構成する分子は、それらを通過する光線を反射できたす。 そのため、オブゞェクトの認識方法を倉曎できたす。 倧幅に簡略化するず、分子が芖力に圱響を䞎える可胜性がある2぀の方法がありたす。

倖方散乱

分子が光ず盞互䜜甚する最も明癜な方法は、光を反射しお方向を倉えるこずです。 カメラに向けられた光線が反射される堎合、 倖偎に散乱するプロセスを芳察したす。


実際の光源は1秒間に4兆個の光子を攟出し、䞀定の確率でそれぞれが空気分子ず衝突する可胜性がありたす。 光が移動する媒䜓の密床が高いほど、単䞀光子の反射が起こりやすくなりたす。 倖方散乱の効果は、光の移動距離にも䟝存したす。


倖方散乱は、光が埐々に薄暗くなるずいう事実に぀ながり、この特性は移動距離ず空気密床に䟝存したす。

内偎ぞの散乱

光が粒子によっお反射されるず、カメラにリダむレクトされるこずがありたす。 このような効果は倖方散乱の反察であり、 内方散乱ず呌ばれるのは論理的です。


特定の条件䞋では、内偎ぞの散乱により、カメラの盎接の芖野内にない光源を芋るこずができたす。 これの最も明らかな結果は、光孊効果-光源の呚りの光のハロヌです。 これらは、カメラが1぀の光源から盎接光線ず間接光線の䞡方を受け取るずいう事実により発生し、事実䞊、受け取る光子の数が増加したす。


単䜍䜓積散乱


1぀の光線は、任意の回数だけ反射できたす。 ぀たり、カメラに入る前です。 ビヌムは非垞に難しいルヌトを通過できたす。 高品質の半透明のマテリアルをレンダリングするには、個々の光線のそれぞれのパスをシミュレヌトする必芁があるため、これは私たちにずっお深刻な困難になりたす。 この手法はレむトレヌシングず呌ばれ、珟圚、リアルタむムで実装するにはコストがかかりすぎたす。 このチュヌトリアルで玹介するナニット散乱技術では、単䞀の光ビヌム散乱むベントを考慮したす。 埌で、このような単玔化により、実際のレむトレヌシングに必芁な蚈算のほんの䞀郚で珟実的な結果を埗るこずができるこずがわかりたす。

珟実的な空をレンダリングする基瀎は、惑星の倧気を通過するずきに光線に䜕が起こるかをシミュレヌトするこずです。 䞋の図は、惑星を芗くカメラを瀺しおいたす。 このレンダリング手法の䞻なアむデアは、光がどのように移動するかを蚈算するこずです A で B 散乱が圱響したす。 これは、カメラに入射するビヌムに察する散乱の圱響を蚈算する必芁があるこずを意味したす。 䞊蚘のように、倖郚ぞの散乱により、枛衰が芳察されたす。 各ポむントに存圚する光の量 P in\䞊線AB䞊線 カメラからの反射の可胜性はわずかです。


各ポむントで発生する倖方散乱の量を正しく考慮する P 、最初にどのくらいの光が存圚しおいたかを知る必芁がありたす P 。 1぀の星だけが惑星を照らしおいるず仮定するず、受け取ったすべおの光 P 倪陜から来なければなりたせん。 この光の䞀郚は内偎に散乱し、カメラで反射されたす。


これらの2぀のステップは、倧気で芳枬されるほずんどの圱響を近䌌するのに十分です。 ただし、光の量が P 光が倧気を通過するずき、倪陜からも倖に散乱する C で P 。


必芁なこずをたずめるず



これは光線がカメラに入る唯䞀の方法ではありたせん
このチュヌトリアルで提案する解決策は、芖野に沿った内郚散乱を考慮に入れおいたす \䞊線AB䞊線 。 ポむントに到達する光 P 倪陜から、特定の確率でカメラに反映するこずができたす。

ただし、光線がカメラに入る方法は倚数ありたす。 たずえば、途䞭で倖偎に散乱する光線の1぀ P 、2回目の衝突では、カメラに向かっお散乱する可胜性がありたす䞋の図を参照。 たた、3回、たたは4回反射した埌、カメラに到達する光線がある堎合がありたす。

怜蚎しおいる手法は、 単䞀散乱ず呌ばれたす。これは、芖野に沿った内偎ぞの散乱のみを考慮するためです。 より掗緎された技術は、このプロセスを拡匵し、ビヌムがカメラに到達する他の方法を考慮するこずができたす。 ただし、可胜なパスの数は、指数関数的に考慮される散乱むベントの数の増加ずずもに増加したす。 幞いなこずに、カメラに入る可胜性も指数関数的に枛少したす。

パヌト2.倧気散乱の理論


このパヌトでは、この耇雑で玠晎らしい光孊珟象を支配する方皋匏の導出を開始したす。

送信機胜


カメラに送信される光の量を蚈算するには、倪陜からの光線が通過するのず同じ旅をするのが䟿利です。 䞋の図を芋るず、光線が届くのは簡単です C 空きスペヌスを通過したす。 圌らの道には䜕もないので、すべおの光が届きたす C 散乱効果は受けたせん。 倉数を瀺したしょう Ic ドットが受け取る非散乱光の量 C 倪陜から。 圌の旅の間に P 、光線は惑星の倧気に入りたす。 いく぀かの光線は、空䞭にぶら䞋がっおいる分子ず衝突し、さたざたな方向に反射されたす。 その結果、光の䞀郚が邪魔にならないように散乱されたす。 届く光の量 P ずしお指定 IP より小さい Ic 。


比率 Ic そしお IP パスず呌ばれる

T\巊\䞊線CP\右= fracIPIC

巊䞊線右


これを䜿甚しお、からの移動時に散乱されなかった぀たり、 芋逃された 光の割合を瀺すこずができたす C 前に P 。 埌で、この関数の性質を探りたす。 これたでのずころ、私たちが知る必芁があるのは、それが倖の倧気散乱の効果に察応しおいるずいうこずだけです。

その結果、受光量 P 等しい

IP=IC\、T\巊\䞊線CP\右

、巊䞊線右


散乱関数


ポむント P 倪陜から盎接光を受けたす。 ただし、このすべおの光が通過するわけではありたせん P カメラに送信されたす。 カメラに実際に到達する光の量を蚈算するために、新しい抂念を導入したす  散乱関数 S 。 特定の方向に反射した光の量を瀺したす。 䞋の図を芋るず、ある角床で反射した光線のみがカメラに向けられおいるこずがわかりたす。 \シヌタシヌタ 。


䟡倀 S\巊\ラムダ、\シヌタ、h\右巊ラムダ、シヌタ、右 反射する光の割合を瀺したす \シヌタシヌタ ラゞアン。 この関数は私たちの䞻な問題であり、次のパヌトでその性質を調べたす。 これたでのずころ、あなたが知る必芁がある唯䞀のこずは、それが受信した光の色に䟝存するずいうこずです 波長によっお決定されたす \ラムダラムダ 、 散乱角 \シヌタシヌタ ず高さ h ポむント P 。 倧気密床は高床の関数ずしお倉化するため、高床は重芁です。 たた、密床は散乱光の量を決定する芁因の1぀です。

これで、透過する光の量を瀺す䞀般的な方皋匏を曞くために必芁なすべおのツヌルができたした。 P に A 

IPA= boxedIP\、S left lambda、 theta、h right\、T left overlinePA right

、、、、



前の定矩のおかげで、拡匵できたす IP 

IPA= boxedIC\、T left overlineCP right\、S left lambda、 theta、h right\、T left overlinePA\右=

、、、、、右


= underset textin−scattering underbraceIC\、S left lambda、 theta、h right、 underset textout−scattering\䞋括匧T\巊\䞊線CP\右\、T\巊\䞊線PA\右

、、、、䞋括匧巊䞊線右、巊䞊線右


方皋匏はそれ自䜓を物語っおいたす


数倀積分


前の段萜を泚意深く読んだ堎合、茝床がさたざたな方法で蚘録されおいるこずに気付くかもしれたせん。 蚘号 IPA から送信される光の量を瀺したす P に A 。 ただし、倀は受信するすべおの光を考慮しおいたせん A 。 倧気散乱のこれらの単玔化されたモデルでは、倧気䞭のカメラの芖野に沿った各ポむントから内偎ぞの散乱を考慮したす。

受け取った光の総量 A  Ia 、すべおのポむントの圱響を合蚈しお蚈算されたす P in\䞊線AB 。 数孊の芳点から、セグメントで \䞊線AB 無限の数のポむントがあるため、それらすべおを巡回するこずは䞍可胜です。 ただし、分割するこずはできたす \䞊線AB 長さが短い堎合 ds 䞋の図を参照、それぞれの圱響を芁玄したす。


このような近䌌プロセスは数倀積分ず呌ばれ、次の匏に぀ながりたす。

IA= sumP in\オヌバヌラむンABIPA\、ds


考慮に入れるポむントが倚いほど、最終結果はより正確になりたす。 実際には、倧気シェヌダヌでは、いく぀かのポむントを単玔に埪環したす Pi 倧気の内郚で、党䜓の結果に及がす圱響を芁玄したす。

なぜdsを掛けるのですか
ここでは、連続珟象の近䌌を䜿甚したす。 怜蚎するポむントが倚いほど、実際の結果に近づくこずができたす。 各ポむントに乗算する ds 、その長さに応じお圱響力の重みを䞎えたす。 ポむントが倚いほど、それぞれの重芁性は䜎くなりたす。

別の方法で芋るこずができたす。 ds 、すべおのポむントの圱響を「平均」したす。

指向性照明


倪陜が比范的近い堎合、 点光源ずしおモデル化するのが最善です。 この堎合、受け取った金額 C 光は倪陜たでの距離に䟝存したす。 しかし、私たちが惑星に぀いお話しおいる堎合、倪陜は遠くにあるため、その光線はある角床で惑星に萜ちるずしばしば思いたす。 これが圓おはたる堎合、倪陜を指向性光源ずしおモデル化できたす 。 指向性光源から受け取った光は、移動距離に関係なく䞀定です。 したがっお、すべおのポむント C 同じ量の光を受け取り、倪陜に察する方向はすべおのポむントで同じです。


この仮定を䜿甚しお、方皋匏を単玔化できたす。

亀換したしょう Ic 䞀定 Is 、これは倪陜の明るさを決定したす。

IA= sumP in\オヌバヌラむンAB boxedIPA\、ds=


= sumP in overlineAB boxedIC\、S left lambda、 theta、h right\、T left overlineCP right ã€T\巊\䞊線PA\右\、ds=


=IS sumP in overlineABS left lambda、 theta、h right\、T left overlineCP right\、T left\䞊線PA\右\、ds=


実行できる別の最適化がありたす。これには散垃関数が含たれたす S\巊\ラムダ、\シヌタ、h\右 。 日光が垞に䞀方向から萜ちる堎合、角床 \シヌタ 氞続的になりたす。 以䞋では、指瀺された圱響を金額から陀倖できるこずがわかりたす S\巊\ラムダ、\シヌタ、h\右 。 しかし、今のずころ、私たちは圌を去りたす。

吞収係数


光ず空気分子間の盞互䜜甚の考えられる結果を説明する際に、通過たたは反射の2぀のオプションのみを蚱可したした。 しかし、3番目の可胜性がありたす。 䞀郚の化合物は光を吞収したす。 地球の倧気には、この性質を持぀倚くの物質がありたす。 たずえば、オゟンは䞊局倧気にあり、玫倖線ず積極的に盞互䜜甚したす。 ただし、可芖スペクトル倖の光を吞収するため、その存圚は空の色には実質的に圱響したせん。 ここ地球では、光を吞収する物質の圱響はしばしば無芖されたす。 しかし、他の惑星の堎合、それを拒吊するこずは䞍可胜です。 たずえば、海王星ず倩王星の通垞の着色は、倧気䞭の倧量のメタンの存圚によっお匕き起こされたす。 メタンは赀い光を吞収し、青みを垯びたす。 チュヌトリアルの残りの郚分では、吞収係数を無芖したすが、倧気を「色付け」する方法を远加したす。

ハリケヌンオフィヌリア2017幎に倪陜が赀くなったのはなぜですか
英囜に䜏んでいる堎合、ハリケヌンオフィヌリアの間に倪陜が赀くなったこずに気づいたかもしれたせん。 これは、オフィヌリアがサハラから砂を持っおきたために起こりたした。 空気䞭にぶら䞋がっおいるこれらの小さな粒子は、散乱効果を高めたした。 次のパヌトで芋るように、青色光は赀色光よりも散乱したす。

可芖スペクトルの色䞋を芋るず、十分な青色光が散乱しおいる堎合、空が実際に黄色たたは赀に倉わるこずが簡単にわかりたす。


空の色は黄色いグラニュヌ糖の色合いに関連しおいるず蚀う誘惑がありたす。 ただし、通垞は黒に近い煙粒子が原因で、倧芏暡な火灜でも同じ効果が芋られたす。

パヌト3。レむリヌ散乱の数孊。


このパヌトでは、レむリヌ散乱の数孊、぀たり空が青く芋える光孊珟象に粟通したす。 方皋匏のこの郚分で導出された方皋匏は、次の郚分のシェヌダヌコヌドに転送されたす。

はじめに


前のパヌトでは、シェヌダヌで倧気散乱を近䌌するための優れた基瀎を提䟛する方皋匏を導き出したした。 ただし、1぀の匏では説埗力のある結果が埗られないずいう事実を芋逃しおいたす。 矎しい雰囲気のシェヌダヌが必芁な堎合は、数孊を少し深くする必芁がありたす。

光ず物質の盞互䜜甚は非垞に耇雑であり、簡単な方法で完党に説明するこずはできたせん。 実際、倧気散乱のモデリングには非垞に時間がかかりたす。 問題の䞀郚は、倧気が均䞀な環境ではないこずです。 その密床ず組成は高さの関数ずしお倧きく異なるため、「理想的な」モデルを䜜成するこずはほずんど䞍可胜です。

そのため、いく぀かの散乱モデルが科孊文献に蚘茉されおおり、各モデルは特定の条件䞋で発生する光孊珟象のサブセットを説明するこずを目的ずしおいたす。 惑星によっお瀺された光孊効果のほずんどは、 レむリヌ散乱ず球状粒子による光散乱ずいう 2぀の異なるモデルで再珟できたす。 これらの2぀の数孊ツヌルを䜿甚するず、さたざたなサむズのオブゞェクトでの光散乱を予枬できたす。 最初のモデルでは、空気のほずんどを構成する酞玠および窒玠分子による光の反射をモデル化したす。 埌者は、花粉、ほこり、汚染物質など、䞋局倧気に存圚する倧きな構造物での光の反射をモデル化したす。

レむリヌ散乱は、青い空ず赀い日没の原因です。 球圢の粒子による光の散乱により、雲は癜色になりたす。 これがどのように発生するかを知りたい堎合は、散乱の数孊をさらに深く掘り䞋げる必芁がありたす。

レむリヌ散乱


粒子に衝突する光子の運呜は䜕ですか この質問に答えるには、より正匏に蚀い換える必芁がありたす。 光線が空の空間を通過しお、突然粒子ず衝突するこずを想像しおください。 このような衝突の結果は、粒子のサむズず光線の色に倧きく䟝存したす。 粒子が十分に小さい堎合原子たたは分子のサむズ、光の振る舞いはレむリヌ散乱を䜿甚しおより適切に予枬されたす。

䜕が起こっおいるの 䞖界の䞀郚は、圱響を「感じない」旅を続けおいたす。 ただし、この光源光のごく䞀郚は粒子ず盞互䜜甚し、すべおの方向に散乱したす。 ただし、すべおの方向が同じ量の光を受け取るわけではありたせん。 光子は、粒子を盎接通過するか、跳ね返る可胜性が高くなりたす。 ぀たり、光子反射オプションは90床小さくなりたす。 この動䜜は、次の図で確認できたす。 青い線は、散乱光の最も可胜性の高い方向を瀺しおいたす。


この光孊珟象は数孊的にレむリヌ散乱方皋匏で蚘述されたす S\巊\ラムダ、\シヌタ、h\右 それは私たちに光源光のシェアを䞎えたす I0 方向に反映 \シヌタ 

I=I0\、S\巊\ラムダ、\シヌタ、h\右


S\巊\ラムダ、\シヌタ、h\右= frac pi2\巊n2−1\右22\アンダヌセット textdensity\アンダヌブレヌス frac rho\巊h\右N\オヌバヌセット textwavelength\オヌバヌブレヌス frac1 lambda4\アンダヌセット\テキストゞオメトリ\䞋括匧\巊1+ cos2\シヌタ\右


どこで


しかし、これはレむリヌ散乱方皋匏ではありたせん
コンピュヌタグラフィックスの分野以倖でレむリヌ散乱に遭遇した堎合、別の方皋匏を芋た可胜性がありたす。 たずえば、 「Rayleigh Scatter」蚘事のりィキペディアの蚘事は倧きく異なりたす。

このチュヌトリアルで䜿甚される匏は、科孊蚘事「 倧気の散乱を考慮に入れた地球の衚瀺」 、西田他から匕甚されおいたす。

この関数はどこから来たのですか
このブログの目的の1぀は、取埗したすべおの倀の出力を説明するこずです。 残念ながら、これはレむリヌ散乱には適甚されたせん。

空気分子から光の粒子が非垞に奇劙に反射される理由を理解するこずにただ興味がある堎合は、䜕が起こっおいるのかを盎感的に理解するこずで次の説明が埗られたす。

レむリヌ散乱の理由は、実際には粒子の「反発」ではありたせん。 光は電磁波であり、特定の分子に存圚する電荷の䞍平衡ず盞互䜜甚する可胜性がありたす。 これらの電荷は、結果ずしお生じる電磁攟射の吞収により飜和し、埌に再び攟射されたす。 角床関数に瀺された二郚圢状は、空気分子が埮小アンテナのように攟射する電気双極子になる方法を瀺しおいたす。

レむリヌ散乱で最初に確認できるこずは、ある方向では他の方向よりも倚くの光が䌝搬するこずです。 2番目の重芁な偎面は、散乱光の量が波長に倧きく䟝存するこずです。 \ラムダ 来お光。 䞋の円グラフはレンダリングしたす S\巊\ラムダ、\シヌタ、0\右 3぀の異なる波長甚。 蚈算 S で h=0 しばしば海面散乱ず呌ばれたす 。


以䞋の図は、可芖スペクトルの連続波長/色範囲の散乱係数の芖芚化を瀺しおいたすコヌドはShaderToyで利甚可胜です。


この範囲の波長は可芖スペクトルの倖偎にあるため、画像の䞭心は黒く芋えたす。

レむリヌ散乱係数


レむリヌ散乱方皋匏は、特定の方向に散乱される光の量を瀺したす。 ただし、どのくらいの゚ネルギヌが消費されたかはわかりたせん。 これを蚈算するには、 すべおの方向の゚ネルギヌ散逞を考慮する必芁がありたす。 方皋匏の導出は簡単ではありたせん。 耇雑な分析をマスタヌしおいない堎合、結果は次のずおりです。

 beta left lambda、h right= frac8 pi3 leftn2−1 right23 frac rho lefth rightN frac1 lambda4


どこで  beta left lambda、h right 単䞀の粒子ずの衝突埌の散乱により倱われる゚ネルギヌの割合を瀺したす。 倚くの堎合、この倀はレむリヌ散乱係数ず呌ばれたす。

チュヌトリアルの前の郚分を読んだ堎合、あなたはそれを掚枬するこずができたす \ベヌタ 実際には 、透過率の決定に䜿甚された枛衰係数です T\巊\䞊線AB\右 セグメント䞊 \䞊線AB 。

残念ながら、蚈算 \ベヌタ ずおも高い。 䜜成するシェヌダヌでは、できるだけ倚くの蚈算を保存しようずしたす。 このため、定数であるすべおの芁因を散乱係数から「抜出」するず䟿利です。 私たちに䞎えるもの \ベヌタ\巊\ラムダ\右 、 海面でのレむリヌ散乱係数  h=0 

 beta left lambda right= frac8 pi3 leftn2−1 right23 frac1N frac1 lambda4


蚈算を芋せおください
レむリヌ散乱方皋匏は、特定の方向に散乱した゚ネルギヌの割合を瀺しおいたす。 総損倱を蚈算するには、考えられるすべおの方向を考慮する必芁がありたす。 連続した間隔での合蚈には、 積分が必芁です。

統合を詊みるこずができたす S\巊\ラムダ、\シヌタ、h\右 によっお \シヌタ 間隔で \å·Š[0.2 pi\右] しかし、それは間違いです。

レむリヌ散乱を2次元で芖芚化したずいう事実にもかかわらず、これは実際には3次元の珟象です。 散乱角 \シヌタ 3D空間で任意の方向を取るこずができたす。 に䟝存する関数の完党な分垃を考慮した蚈算 \シヌタ 䞉次元空間で S は立䜓角䞊の積分ず呌ばれたす

 beta left lambda、h right= int2 pi0 int pi0S left lambda、 theta、h right sin theta\、d thetad phi


内郚積分運動 \シヌタ XY平面で、倖偎の平面は結果をX軞の呚りに回転させお、3番目の次元を考慮したす。 远加したした  sin theta 球面角床に䜿甚されたす。

統合プロセスは、䟝存するもののみに関心がありたす \シヌタ 。 耇数のメンバヌ S\巊\ラムダ、\シヌタ、h\右 定数であるため、積分蚘号の䞋から転送できたす。

 beta left lambda、h right= int2 pi0 int pi0 underset textconstant underbrace frac pi2\巊n2−1\右22 frac rho\巊h\右N frac1 lambda4 left1+ cos2 theta right sin theta\、d thetad phi=


= frac pi2 leftn2−1 right22 frac rho lefth rightN frac1 lambda4 int2 pi0 int pi0 left1+ cos2 theta right sin theta\、d thetad phi


これにより、内郚積分が倧幅に簡玠化され、次の圢匏になりたす。

 beta left lambda、h right= frac pi2 leftn2−1 right22 frac rho lefth rightN frac1 lambda4 int2 pi0 boxed int pi0 left1+ cos2 theta\右 sin theta\、d thetad phi=


= frac pi2 leftn2−1 right22 frac rho lefth rightN frac1 lambda4 int2 pi0 boxed frac83d phi


これで、倖郚統合を実行できたす。

 beta left lambda、h right= frac pi2 leftn2−1 right22 frac rho lefth rightN frac1 lambda4 boxed int2 pi0 frac83d phi=


= frac pi2 leftn2−1 right22 frac rho lefth rightN frac1 lambda4 boxed frac16 pi3


これにより、最終フォヌムに到達したす。

 beta left lambda、h right= frac8 pi3 leftn2−1 right23 frac rho lefth rightN frac1 lambda4


これはすべおの方向の散乱の圱響を考慮した積分なので、匏はもはや䟝存しおいたせん \シヌタ 。

この新しい方皋匏は、異なる色がどのように散らばっおいるのかを理解する別の方法を提䟛したす。 以䞋のグラフは、光がさらされる散乱の量をその波長の関数ずしお瀺しおいたす。


これは散乱係数間の匷い関係です。 \ベヌタ そしお \ラムダ これは日没時に赀い空を匕き起こしたす。 倪陜から受け取った光子は、より広い範囲の波長に分垃したす。 レむリヌ散乱は、地球の倧気の原子や分子が緑や赀よりも青を匷く散乱するこずを瀺しおいたす。 光が十分に長く移動できる堎合、散乱のためにその青色成分党䜓が倱われたす。 これは、日没時に光が衚面ずほが平行に移動するずきに起こるこずです。

同じように掚論するず、空が青く芋える理由を理解できたす。 倪陜の光は䞀方向から萜ちおいたす。 ただし、その青色成分はすべおの方向に散圚しおいたす。 空を芋るず、すべおの方向から青い光が圓たりたす。

レむリヌ䜍盞関数


レむリヌ散乱を蚘述する元の方皋匏、 S\巊\ラムダ、\シヌタ\右 、2぀のコンポヌネントに分解できたす。 最初は、導出したばかりの散乱係数です。 \ベヌタ\巊\ラムダ\右 その匷床を倉調したす。 2番目の郚分は散乱ゞオメトリに関連し、その方向を制埡したす。

S left lambda、 theta、h right= beta left lambda、h right gamma left theta right


この新しい䟡倀 \ガンマ\巊\シヌタ\右 分割するこずで取埗できたす S\巊\ラムダ、\シヌタ、h\右 に \ベヌタ\巊\ラムダ\右 

 gamma left theta right= fracS left lambda、 theta、h right beta left lambda right=


= undersetS left lambda、 theta、h right underbrace frac pi2 leftn2−1 right22 frac rho lefth rightN frac1 lambda4 left1+ cos2 theta right、 underset frac1 beta left lambda right underbrace frac38 pi3 leftn2−1 right2 fracN rho\巊h\右\ラムダ4=


= frac316 pi left1+ cos2 theta right


この新しい匏は、入射光の波長に䟝存しないこずがわかりたす。 これは、レむリヌ散乱が短波により匷く圱響するこずが確実にわかっおいるため、盎感に反するように思われたす。

しかし \ガンマ\巊\シヌタ\右 䞊で芋た双極子の圢状をモデル化したす。 䌚員  frac316 pi 正芏化係数ずしお機胜し、すべおの可胜な角床にわたる積分 \シヌタ 芁玄 1 。 技術的に定匏化された堎合、積分は 4 pi ステラゞアンが等しい 1 。

次のパヌトでは、これら2぀のコンポヌネントを分離するこずで、より効率的な方皋匏を導き出す方法を説明したす。

たずめるず




S left lambda、 theta、h right= frac pi2 leftn2−1 right22 frac rho lefth rightN frac1 lambda4 left1+ cos2 theta right


さらに

S left lambda、 theta、h right= beta left lambda、h right gamma left theta right



 beta left lambda、h right= frac8 pi3 leftn2−1 right23 frac rho lefth rightN frac1 lambda4



 beta left lambda right= beta left lambda、0 right= frac8 pi3 leftn2−1 right23 frac1N frac1 lambda4


赀、緑、青の色にほが察応する波長を考慮するず、次の結果が埗られたす。

\ベヌタ\巊680nm\右=0.00000519673


\ベヌタ\巊550nm\右=0.0000121427


\ベストヌタ \巊 440 N M \右 = 0.0000296453


これらの結果は、次の仮定の䞋で蚈算されたす。 h = 0 これは、  r h o = 1  これは、分散係数が最倧倀をずる海面でのみ発生したす。 したがっお、光散乱の量の「ガむド」ずしお機胜したす。



 gamma left theta right= frac316 pi left1+ cos2 theta right



\ rho \ lefth \ right= exp \ left \ {-\ frac {h} {H} \ right \}


どこで H=$850 メヌトルは高さの枛少ず呌ばれたす。

パヌト4。倧気䞭を旅したす。


このパヌトでは、異なる高さでの倧気密床のモデリングを怜蚎したす。 倧気の密床はレむリヌ散乱の正しい蚈算に必芁なパラメヌタヌの1぀であるため、これは必芁な手順です。

倧気密床係数


これたでのずころ、倧気密床係数の圹割は考慮しおいたせん  rho 。 散乱力は倧気の密床に比䟋するこずは論理的です。 1立方メヌトルあたりの分子が倚いほど、光子散乱の可胜性が高くなりたす。 困難なのは、倧気の構造が非垞に耇雑であり、圧力、密床、枩床が異なる耇数の局で構成されおいるこずです。 幞いなこずに、レむリヌ散乱の倧郚分は倧気の最初の60 kmで発生したす。 察流圏では、枩床は盎線的に䜎䞋し、圧力は指数関数的に䜎䞋したす。

䞋の図は、䞋局倧気の密床ず高さの関係を瀺しおいたす。


䟡倀  rho\巊h\右 高床での倧気の枬定倀です h れロから始たる方法で正芏化されたメヌトル。 倚くの科孊蚘事で  rho 次のように定矩するこずもできるため、密床係数ずも呌ばれたす。

 rho lefth right= fracdensity lefth rightdensity left0 right


真の密床を 密床\巊0\右 私たちはそれを埗る  rho\巊h\右 海面で等しい 1 。 ただし、䞊蚘で匷調したように、蚈算 密床\巊h\右 些现なこずからほど遠い。 これを指数曲線ずしお近䌌できたす。 あなた方の䜕人かは、䜎気圧の密床が指数関数的に枛少しおいるこずに既に気付いおいるかもしれたせん。

密床曲線を指数曲線で近䌌したい堎合は、次のようにしたす。

\ rho \ lefth \ right= exp \ left \ {-\ frac {h} {H} \ right \}


どこで H0 瞮小高さず呌ばれるスケヌル係数です。 地球の䜎局倧気におけるレむリヌ散乱に぀いおは、しばしば H=$850 メヌトル䞋図を参照。 球状粒子による光の散乱の堎合、倚くの堎合、倀はほが等しい 1200 メヌトル。


に䜿甚される倀 H 最良の近䌌を䞎えない  rho\巊h\右 。 ただし、これは実際には問題ではありたせん。 このチュヌトリアルで提瀺される倀のほずんどは、深刻な近䌌を受けおいたす。 芖芚的に快適な結果を䜜成するには、参照画像に䜿甚可胜なパラメヌタヌを調敎する方がはるかに効率的です。

指数関数的な枛少


チュヌトリアルの前の郚分で、個々の粒子ず盞互䜜甚した埌に光線がさらされる倖方散乱を考慮する方法を瀺す方皋匏を思い぀きたした。 この珟象をモデル化するために䜿甚される倀は、散乱係数ず呌ばれおいたした。 \ベヌタ 。 それを考慮するために、係数を導入したした \ベヌタ 。

レむリヌ散乱の堎合、1回の盞互䜜甚で倧気散乱の圱響を受ける光の量を蚈算するための閉圢匏も導出したした。

 beta left lambda、h right= frac8 pi3 leftn2−1 right23 frac rho lefth rightN frac1 lambda4


海面で蚈算するずき、぀たり h=0 、方皋匏は次の結果を䞎えたす

\ベヌタ\巊680nm\右=0.00000519673


\ベヌタ\巊550nm\右=0.0000121427


\ベヌタ\巊440nm\右=0.0000296453


どこで 680 、 550 そしお 440 -赀、緑、青にほが察応する波長。

これらの数字の意味は䜕ですか それらは、粒子ずの単䞀の盞互䜜甚で倱われる光の割合を衚したす。 光線が最初に明るさを持っおいるず仮定しお I0 䞀般的な散乱係数で倧気の䞀郚を通過させたす \ベヌタ 、その埌、散乱埌に残る光の量は次のずおりです。

I1=I0⏟initial energy−I0β⏟energy lost=I0(1−β)


これは1回の衝突の堎合に圓おはたりたすが、特定の距離内でどのような゚ネルギヌが消費されるかに぀いお関心がありたす。これは、残りの光がすべおの点でこのプロセスを経るこずを意味したす。

光が散乱係数を持぀均䞀な媒䜓を通過するずき\ベヌタ、特定の距離を移動したずきにどれだけ残るかをどのように蚈算できたすか

分析を孊んだ人にずっおは、これはおなじみのように思えるかもしれたせん。連続的なセグメントで乗算プロセスが繰り返される堎合(1−β)、次にオむラヌ数がシヌンに入りたす。通過埌の散乱埌に残っおいる光の量x メヌトルが等しい

I=I0exp{−βx}


繰り返したすが、指数関数に盎面しおいたす。密床係数を衚す指数関数ずは関係ありたせん。ρ 。どちらの珟象も指数関数的であるため、䞡方の珟象は指数関数で蚘述されたす。それ以倖は、それらの間に関係はありたせん。

expはどこから来たのですか
, , , I 1 = I 0 1 - β  私= I 0、E X P { - β X } 。

. , , :

I 1 = I 0  1 - β2


I 2 = I 1 1 - β2


:

I 2 = I 0  1 - β2)(1−β2)=


=I0(1−β2)2


I2 . ? ? ? :

I=limn→∞I0(1−βn)n


どこで limn→∞ — , . , ∞ , - β∞ 。

:

limn→∞(1−βNN=E-β=EXP{-β}


, .

均䞀な透過率


チュヌトリアルの埌半では、䌝送の抂念を玹介したした T散乱プロセス埌に倧気を通過するずきに残る光の割合ずしお。これで、それを蚘述する方皋匏を掚定するためのすべおの芁玠ができたした。

䞋の図を芋お、セグメントの透過率を蚈算する方法を考えおみたしょう CPの䞊 。 光線が届くこずが簡単にわかりたす C空のスペヌスを通過したす。したがっお、それらは散らばっおいたせん。その結果、C実際に倪陜の明るさに等しい IS 。 この旅の間に P光の䞀郚は邪魔にならないように散乱されたす。したがっお、到達する光の量P  IP より小さい IS 。


散乱光の量は、移動距離によっお異なりたす。パスが長いほど、枛衰が倧きくなりたす。指数関数的枛少の法則によれば、ある点での光量IP 次のように蚈算できたす。

IP=ISexp{−β¯CP}


どこで  CPの䞊 -セグメントの長さ C 前に P 、そしお exp{x}- 指数関数 ex 。

倧気䌝送


反射の確率散乱係数 \ベヌタ に沿っお各点で同じ  CPの䞊 。 残念ながら、そうではありたせん。

散乱係数は、倧気の密床に倧きく䟝存したす。立方メヌトルあたりの空気分子が倚いほど、衝突の可胜性が高くなりたす。惑星の倧気の密床は䞍均䞀であり、高床によっお異なりたす。これはたた、倖向き散乱を蚈算できないこずを意味したす CPの䞊ワンステップで。この問題を解決するには、散乱係数を䜿甚しお各ポむントで倖向きの分散を蚈算する必芁がありたす。

これがどのように機胜するかを理解するために、近䌌から始めたしょう。線分 CPの䞊 2぀に分かれおいたす ¯CQ そしお ¯QP 。


たず、光の量を蚈算したす C 到達する Q 

IQ=ISexp{−β(λ,h0)¯CQ}


次に、同じアプロヌチを䜿甚しお、到達する光の量を蚈算したす P から Q 

IP=IQexp{−β(λ,h1)¯QP}


代甚すれば IQ 2番目の方皋匏に入れお単玔化するず、


もし ¯CQ そしお ¯QP 同じ長さを持っおいる ds 、匏をさらに簡略化できたす。


異なる散乱係数を持぀同じ長さの2぀のセグメントの堎合、倖向きの散乱は、個々のセグメントの散乱係数を合蚈し、セグメントの長さを掛けるこずによっお蚈算されたす。

任意の数のセグメントでこのプロセスを繰り返し、真の倀にたすたす近づいおいきたす。これにより、次の方皋匏が導かれたす。

IP=ISexp{−∑Q∈¯CPβ(λ,hQ)ds}


どこで hQ -ポむントの高さ Q 。

先ほど䜿甚した盎線を倚くのセグメントに分割する方法は、数倀積分ず呌ばれたす。

最初に受け取った光の量が1 、任意のセグメントを通る倧気透過の方皋匏を取埗したす。

T(¯CP)=exp{−∑Q∈¯CPβ(λ,hQ)ds}


この匏をさらに拡匵できたす。合蚈を眮き換える\ベヌタ レむリヌ散乱で䜿甚される実際の倀、 \ベヌタ 

T(¯CP)=exp{−∑Q∈¯CP8π3(n2−1)23ρ(hQ)N1λ4ds}


倚くの芁因 \ベヌタ 以䞋の量で実行できるように、定数

T(¯CP)=exp{−8π3(n2−1)231N1λ4⏟constantβ(λ)optical depthD(¯CP)⏞∑Q∈¯CPρ(hQ)ds}


合蚈で衚される倀は、光孊的厚さず呌ばれたす D(¯CP)これをシェヌダヌで蚈算したす。残りは、䞀床しか蚈算できない倍率であり、海面での散乱係数に察応したす。完成したシェヌダヌでは、海面での光孊的厚さず散乱係数のみを蚈算したす\ベヌタ入力ずしお送信したす。

芁玄するず

T(¯CP)=exp{−β(λ)D(¯CP)}



パヌト5.倧気シェヌダヌ。


はじめに


シェヌダヌを曞く


この゚フェクトのシェヌダヌの䜜成を無数の方法で開始できたす。倧気散乱を惑星にレンダリングしたいので、球䜓で䜿甚されるず仮定するのは論理的です。

このチュヌトリアルを䜿甚しおゲヌムを䜜成する堎合、既存の惑星にシェヌダヌを適甚する可胜性がありたす。スりォッチの䞊に倧気散乱蚈算を远加するこずは可胜ですが、通垞は結果が良くありたせん。その理由は、倧気が惑星の半埄よりも倧きいため、わずかに倧きいサむズの透明な球䜓にレンダリングする必芁があるためです。䞋の図は、倧気が惑星の衚面䞊に広がり、背埌の空の空間ず混ざり合っおいる様子を瀺しおいたす。


別の球䜓ぞの分散性材料の適甚は可胜ですが、冗長です。このチュヌトリアルでは、倧気をわずかに倧きな球䜓にレンダリングするシェヌダヌパッセヌゞを远加しお、Standard Surface Shader Unityを拡匵するこずをお勧めしたす。これを倧気圏ず呌びたす。

2パスシェヌダヌ


Unity サヌフェスシェヌダヌを䜿甚しおいた堎合、 頂点およびフラグメント シェヌダヌで耇数のパスが蚭定されるPassブロックをサポヌトしおいないこずに気付くかもしれたせん。

2぀のパスでシェヌダヌを䜜成するこずができたすSubShaderコヌドの2぀の個別のセクションを1぀のSubShaderブロックに远加するだけです。

 Shader "Custom/NewSurfaceShader" { Properties { _Color ("Color", Color) = (1,1,1,1) _MainTex ("Albedo (RGB)", 2D) = "white" {} _Glossiness ("Smoothness", Range(0,1)) = 0.5 _Metallic ("Metallic", Range(0,1)) = 0.0 } SubShader { // ---   --- Tags { "RenderType"="Opaque" } LOD 200 CGPROGRAM //   Cg ENDCG // ------------------ // ---   --- Tags { "RenderType"="Opaque" } LOD 200 CGPROGRAM //   Cg ENDCG // ------------------- } FallBack "Diffuse" } 

最初のパスを倉曎しお、惑星をレンダリングできたす。 これからは、2回目のパスに焊点を圓お、倧気䞭の散乱を実珟したす。

通垞の抌し出し


倧気圏は惑星よりわずかに倧きい。 これは、2番目の通路が球䜓を抌し出すこずを意味したす。 モデルが滑らかな法線を䜿甚しおいる堎合、法線の抌し出しず呌ばれる手法を䜿甚しおこの効果を実珟できたす。

通垞の抌し出しは、最も叀いシェヌダヌトリックの1぀であり、通垞、最初に調査されるものの1぀です。 私のブログには倚くの参照がありたす。 良い出発点は、 「 シェヌダヌ 入門」シリヌズのSurface Shaderの投皿でしょう。

法線の抌し出しの仕組みに慣れおいない堎合は、説明したす。すべおの頂点は、 頂点関数を䜿甚しおシェヌダヌによっお凊理されたす 。 この関数を䜿甚しお各頂点の䜍眮を倉曎し、球䜓を倧きくするこずができたす。

最初のステップは、 vertex:vertを远加しおpragmaディレクティブを倉曎するこずですvertex:vert ; これにより、Unityは各頂点に察しおvert関数を実行したす。

 #pragma surface surf StandardScattering vertex:vert void vert (inout appdata_full v, out Input o) { UNITY_INITIALIZE_OUTPUT(Input,o); v.vertex.xyz += v.normal * (_AtmosphereRadius - _PlanetRadius); } 

このコヌドフラグメントは、法線に沿っお球を抌し出す頂点関数を瀺しおいたす。 球の抌し出し速床は、倧気のサむズず惑星のサむズに䟝存したす。 これらの倀は䞡方ずも、 マテリアルむンスペクタヌからアクセスできるプロパティずしおシェヌダヌに枡す必芁がありたす。

シェヌダヌは、惑星の䞭心がどこにあるかを知る必芁もありたす。 頂点関数にも蚈算を远加できたす。 蚘事「 頂点ずフラグメントシェヌダヌ 」で説明した䞖界の空間でオブゞェクトの䞭心点を芋぀ける。

 struct Input { float2 uv_MainTex; float3 worldPos; //   Unity float3 centre; //     }; void vert (inout appdata_full v, out Input o) { UNITY_INITIALIZE_OUTPUT(Input,o); v.vertex.xyz += v.normal * (_AtmosphereRadius - _PlanetRadius); o.centre = mul(unity_ObjectToWorld, half4(0,0,0,1)); } 

UNITY_INITIALIZE_OUTPUTずは䜕ですか
頂点関数を芋るず、垞に謎の呌び出しUNITY_INITIALIZE_OUTPUTが含たれおいるこずがUNITY_INITIALIZE_OUTPUTたす。 シェヌダヌはオブゞェクトの空間内の頂点の䜍眮を取埗し、Unityが提䟛する䜍眮、スケヌル、回転を䜿甚しお、ワヌルドの座暙にそれらを投圱する必芁がありたす。

そしお、これはUNITY_INITIALIZE_OUTPUTによっお実行される操䜜の1぀です。 それがなければ、これらの蚈算に必芁なコヌドを自分で蚘述する必芁がありたす。

添加剀ブレンド


察凊する必芁があるもう1぀の興味深い機胜は、透明性です。 通垞、透明な玠材を䜿甚するず、オブゞェクトの背埌にあるものを確認できたす。 私たちの堎合、この解決策は機胜したせん。倧気は単なる透明なプラスチックではないからです。 光が通過するため、加算混合モヌドを䜿甚しお惑星の光床を䞊げる必芁がありたす 。

暙準のUnity Surface Shaderでは、デフォルトでブレンドモヌドは有効になっおいたせん。 状況を倉曎するには、2番目のパスのラベルを次のものに眮き換える必芁がありたす。

 Tags { "RenderType"="Transparent" "Queue"="Transparent"} LOD 200 Cull Back Blend One One 

Blend One One゚クスプレッションはシェヌダヌによっお䜿甚され、加算ブレンディングモヌドにアクセスしたす。

ネむティブ照明機胜


ほずんどの堎合、サヌフェスシェヌダヌを蚘述するずき、プログラマはそのsurf関数を倉曎したす。これは、アルベド、衚面の滑らかさ、金属特性などの「物理的な」特性を提䟛するために䜿甚されたす。 これらのプロパティはすべお、シェヌダヌによっおリアルなシェヌディングを蚈算するために䜿甚されたす。

私たちの堎合、これらの蚈算は必芁ありたせん。 それらを取り陀くには 、シェヌダヌで䜿甚されおいる照明モデルを削陀する必芁がありたす。 このトピックを詳现に調べたした。 次の投皿を調べお、これを行う方法を理解できたす。


新しい照明モデルはStandardScatteringず呌ばれたす。 リアルタむム照明ずグロヌバル照明甚の関数、぀たりLightingStandardScatteringずLightingStandardScattering_GIをそれぞれ䜜成する必芁がありたす。

蚘述する必芁があるコヌドは、照明の方向やビュヌの方向などのプロパティも䜿甚したす。 これらは、次のコヌドスニペットを䜿甚しお取埗できたす。

 #pragma surface surf StandardScattering vertex:vert #include "UnityPBSLighting.cginc" inline fixed4 LightingStandardScattering(SurfaceOutputStandard s, fixed3 viewDir, UnityGI gi) { float3 L = gi.light.dir; float3 V = viewDir; float3 N = s.Normal; float3 S = L; //     float3 D = -V; //   ,    ... } void LightingStandardScattering_GI(SurfaceOutputStandard s, UnityGIInput data, inout UnityGI gi) { LightingStandard_GI(s, data, gi); } 

In ...には、この効果を実装するために必芁なシェヌダヌコヌド自䜓が含たれたす。

浮動小数点粟床


このチュヌトリアルでは、すべおの蚈算がメヌトル単䜍で実行されるず仮定したす。 これは、地球をシミュレヌトする必芁がある堎合、半埄6371000メヌトルの球䜓が必芁であるこずを意味したす。 実際、Unityでは、非垞に倧きな数ず非垞に小さな数を同時に凊理する必芁がある堎合に発生する浮動小数点゚ラヌのため、これは䞍可胜です。

これらの制限を回避するために、散乱係数を調敎しお補正できたす。 たずえば、惑星の半埄がわずか6.371メヌトルの堎合、散乱係数は
\ベヌタ\巊\ラムダ\右 1,000,000回を超える必芁がありたす。 H -1,000,000倍少ない。

私のUnityプロゞェクトでは、すべおのプロパティず蚈算はメヌトルで衚されたす。 これにより、散乱係数ず枛少した高さに実際の物理倀を䜿甚できたす。 ただし、シェヌダヌは球のサむズをメヌトル単䜍で取埗するため、Unityナニットから実際のメヌトルたでスケヌルできたす。

パヌト6。倧気の亀差点。


前述のように、倧気を通過するセグメントの光孊的厚さを蚈算する唯䞀の方法は、 数倀積分によるものです。 これは、間隔をより短い長さに分割する必芁があるこずを意味したす ds 密床定数を考慮しお、それぞれの光孊的厚さを蚈算したす。


䞊蚘は光孊的厚さです。 \䞊線AB これは4぀のサンプルで蚈算され、各サンプルではセグメント自䜓の䞭心の密床が考慮されたす。

最初のステップは明らかにポむントを芋぀けるこずです A そしお B 。 レンダリングするオブゞェクトが球䜓であるず仮定するず、Unityはその衚面をレンダリングしようずしたす。 画面䞊の各ピクセルは、球䞊の点に察応しおいたす。 以䞋の図では、このポむントは O  起源から。 サヌフェスシェヌダヌ内 O Input構造のworldPos倉数ず䞀臎したす。 これは、シェヌダヌが行う䜜業量です。 私たちが利甚できる唯䞀の情報は O 方向 D 、これは芖線の方向を瀺し、倧気圏は䞭心にありたす C および半埄 R 。 困難はコンピュヌティングにありたす A そしお B 。 ゞオメトリが最速で䜿甚され、 倧気圏球ずカメラの可芖光線の亀差点を芋぀ける問題が軜枛されたす。


たず、それは泚目に倀する O 、 A そしお B 芖線䞊にありたす。 これは、それらの䜍眮を3D空間の点ずしおではなく、芖線から原点たでの距離ずしお扱うこずができるこずを意味したす。 A 実際のポむントシェヌダヌではfloat3ずしおfloat3 であり、 Ao -開始点たでの距離 O  floatずしお保存されfloat 。 A そしお Ao -同じポむントを指定する2぀の等しく正しい方法、぀たり、それは真実です。

A=O+\䞊線AO\、D


B=O+\䞊線BO\、D


䞊にバヌのある゚ントリはどこですか  XY$の䞊 任意の2点間のセグメントの長さを瀺したす X そしお Y 。

効率化のためのシェヌダヌコヌドでは、 Ao そしお Bo 、それらを蚈算したす Ot 

\䞊線AO=\䞊線OT−\䞊線AT


\䞊線BO=\䞊線OT+\䞊線BT


たた、セグメントが \䞊線AT そしお  BT$に䞊線を匕きた 同じ長さです。 次に、亀点を芋぀けるために、蚈算する必芁がありたす \䞊線AO そしお \䞊線AT 。

線分 \䞊線OT 蚈算する最も簡単な方法。 䞊の図を芋るず、次のこずがわかりたす。 \䞊線OT ベクトルの投圱 CO 芖線䞊。 数孊的には、この投圱はスカラヌ積を䜿甚しお実行できたす。 シェヌダヌに粟通しおいる堎合は、スカラヌ積が2぀の方向の「敎列」の尺床であるこずを知っおいるかもしれたせん。 それが2぀のベクトルに適甚され、そのうちの1぀が単䜍長を持぀堎合、それは射圱挔算子になりたす。

\䞊線OT=\巊C−O\右 cdotD


それはたた泚目に倀する
\巊C−O\右 間のセグメントの長さではなく、3次元ベクトルです C そしお O 。

次に、セグメントの長さを蚈算する必芁がありたす \䞊線AT 。 䞉角圢のピタゎン定理を䜿甚しお蚈算できたす \オヌバヌセット\トラむアングルACT 。 圌女は次のように䞻匵しおいたす

R2=\オヌバヌラむンAT2+\オヌバヌラむンCT


そしおそれはそれを意味したす

 overlineAT= sqrtR2− overlineCT


長さ  CT$の䞊 ただ䞍明です。 ただし、ピタゎラスの定理を䞉角圢に再床適甚するこずで蚈算できたす \オヌバヌセット\トラむアングルOCT 

\䞊線CO2=\䞊線OT2+\䞊線CT2


\䞊線CT= sqrt\䞊線CO2−\䞊線OT2


これで、必芁な数量がすべお揃いたした。 芁玄するず

\䞊線OT=\巊C−O\右 cdotD


\䞊線CT= sqrt\䞊線CO2−\䞊線OT2


\䞊線AT= sqrtR2−\䞊線CT2


\䞊線AO=\䞊線OT−\䞊線AT


\オヌバヌラむンBO=\オヌバヌラむンOT+\オヌバヌラむンAT


この方皋匏のセットには平方根がありたす。 これらは、負でない数に察しおのみ定矩されたす。 もし R2>\䞊線CT2 、解決策はありたせん。これは、芖線が球䜓ず亀差しないこずを意味したす。

これを次のCg関数に倉換できたす。

 bool rayIntersect ( // Ray float3 O, // Origin float3 D, //  //  float3 C, //  float R, //  out float AO, //    out float BO //    ) { float3 L = C - O; float DT = dot (L, D); float R2 = R * R; float CT2 = dot(L,L) - DT*DT; //      if (CT2 > R2) return false; float AT = sqrt(R2 - CT2); float BT = AT; AO = DT - AT; BO = DT + BT; return true; } 

1぀ではなく3぀の倀を返したす \䞊線AO 、  BO$の䞊 亀差点のバむナリ倀。 これらの2぀のセグメントの長さはoutキヌワヌドを䜿甚しお返され、関数がこれらのパラメヌタヌに加えた倉曎を完了した埌に保存されたす。

惑星ずの衝突


考慮すべき別の問題がありたす。 いく぀かの可芖光線が惑星ず衝突するため、倧気圏を通る圌らの旅は早く終わりたす。 1぀の解決策は、䞊蚘を確認するこずです。

より単玔ですが効率の悪いアプロヌチは、 rayIntersect 2回実行し、必芁に応じお゚ンドポむントを倉曎するこずです。


これは、次のコヌドに倉換されたす。

 //     float tA; //     (worldPos + V * tA) float tB; //     (worldPos + V * tB) if (!rayIntersect(O, D, _PlanetCentre, _AtmosphereRadius, tA, tB)) return fixed4(0,0,0,0); //       //      ? float pA, pB; if (rayIntersect(O, D, _PlanetCentre, _PlanetRadius, pA, pB)) tB = pA; 

パヌト7.倧気分散シェヌダヌ。


このパヌトでは、最終的に、惑星の倧気䞭のレむリヌ散乱のシミュレヌションに関する䜜業を完了したす。

GIF

可芖ビヌムサンプリング


最近導出した倧気散乱の方皋匏を思い出しおみたしょう。

I=IS sumP in overlineABS left lambda、 theta、h rightT left overlineCP rightT left overlinePA\右ds


私たちが受け取る光の量は、倪陜が発する光の量に等しく、 Is 各ポむントの個々の効果の合蚈で乗算 P セグメント䞊 \䞊線AB 。

この関数をシェヌダヌに盎接実装できたす。 ただし、ここでいく぀かの最適化を行う必芁がありたす。 前の郚分で、匏をさらに簡略化できるず述べたした。 最初に行うこずは、散乱関数を2぀の䞻芁なコンポヌネントに分割するこずです。

S left lambda、 theta、h right= beta left lambda、h right gamma left theta right= beta left lambda right rho lefth right gamma left theta right


䜍盞関数 \ガンマ\巊\シヌタ\右 および海面分散係数 \ベヌタ\巊\ラムダ\右 角床に察しお \シヌタ ず波長 \ラムダ サンプリングされたポむントから独立しおいたす。 したがっお、それらは次の量で実行できたす。

I=IS\、 beta left lambda right gamma left theta right sumP in overlineABT left overlineCP rightT\巊\䞊線PA\右 rho\巊h\右ds


この新しい匏は、前の匏ず数孊的に䌌おいたすが、最も「重い」郚分が合蚈から導出されるため、蚈算がより効率的です。

ただ実装の準備ができおいたせん。 無限の数のポむントがありたす P 考慮しなければなりたせん。 合理的な近䌌 I 分割されたす \䞊線AB いく぀かの短いセグメントに ds 各セグメントの圱響の远加。 そうするこずで、各セグメントが䞀定の密床を持぀のに十分小さいず仮定できたす。 䞀般的に、これはそうではありたせんが、 ds 十分に小さい堎合、かなり良い近䌌を達成できたす。


のセグメント数 \䞊線AB すべおのセグメントが芖線䞊にあるため、可芖性のサンプルを呌び出したす。 シェヌダヌでは、これは_ViewSamplesプロパティになりたす。 これはプロパティであるため、マテリアルむンスペクタヌからアクセスできたす。 これにより、シェヌダヌのパフォヌマンスの粟床を䞋げるこずができたす。

次のコヌドフラグメントを䜿甚するず、倧気䞭のすべおのセグメントをバむパスできたす。

 //     //      P  AB float3 totalViewSamples = 0; float time = tA; float ds = (tB-tA) / (float)(_ViewSamples); for (int i = 0; i < _ViewSamples; i ++) { //   // (     ) float3 P = O + D * (time + ds * 0.5); // T(CP) * T(PA) * ρ(h) * ds totalViewSamples += viewSampling(P, ds); time += ds; } // I = I_S * β(λ) * γ(Ξ) * totalViewSamples float3 I = _SunIntensity * _ScatteringCoefficient * phase * totalViewSamples; 

time倉数は、開始点からの距離を远跡するために䜿甚されたす。 O 。 各反埩埌、 dsだけ増加したす。

光孊的厚さPA


芖線䞊のすべおのポむント \䞊線AB 描画するピクセルの最終色に貢献したす。 数孊的に衚珟されるこの寄䞎は、合蚈内の倀です。

I=IS\、 beta left lambda right gamma left theta right sumP in overlineAB underset textlightcontributionof\、L\巊P\右\䞋括匧T\巊\䞊線CP\右T\巊\䞊線PA\右 rho\巊h\右ds


最埌の段萜のように、この匏を単玔化しおみたしょう。 䞊蚘の匏をさらに展開するず、 T その定矩

T \巊\䞊線{XY} \右= \ exp \å·Š\ {-\ beta \巊\ラムダ\右D \巊\䞊線{XY} \右\右\}


スキップした結果  CPの䞊 そしお \䞊線PA になりたす

T\巊\䞊線CP\右T\巊\䞊線PA\右=


= \ underset {T \ left\ overline {CP} \ right} {\ underbrace {\ exp \ left \ {-\ beta \ left\ lambda \ rightD \ left\ overline {CP} \ right ïŒ‰\ right \}}} \、\ underset {T \ left\ overline {PA} \ right} {\ underbrace {\ exp \ left \ {-\ beta \ left\ lambda \ rightD \ left \䞊線{PA} \右\右\}}} =


= \ exp \ left \ {-\ beta \ left\ lambda \ right\ leftD \ left\ overline {CP} \ right+ D \ left\ overline {PA} \ right\ right \右\}


結合された透過は指数関数的な枛少ずしおモデル化され、その係数は光が移動する経路に沿った光孊的厚さの合蚈です  CPの䞊 そしお \䞊線PA  海面レベルでの分散係数  \ベヌタ で h=0 
蚈算を開始する最初の倀は、セグメントの光孊的厚さです \䞊線PA 、倧気圏ぞの進入地点から珟圚forルヌプでサンプリングしおいる地点に移動したす。 光孊的厚さの定矩を思い出したしょう

D \巊\䞊線{PA} \右= \ sum_ {Q \ in \䞊線{PA}} {\ exp \å·Š\ {-\ frac {h_Q} {H} \右\}} \、ds


「額」を実装する必芁がある堎合は、ルヌプ内のポむントをルヌプでサンプリングするopticalDepth関数を䜜成したす P そしお A 。 可胜ですが、非垞に非効率的です。 実際、 D\巊\䞊線PA\右 すでに最倖偎のforルヌプで分析しおいるラむンセグメントの光孊的厚さです。 䞭心にある珟圚のセグメントの光孊的厚さを蚈算すれば、倚くの蚈算を保存できたす P  opticalDepthSegment 、およびforルヌプ opticalDepthPA に芁玄し続けたす。

 //    float opticalDepthPA = 0; //     //     P  AB float time = tA; float ds = (tB-tA) / (float)(_ViewSamples); for (int i = 0; i < _ViewSamples; i ++) { //   // (    ) float3 P = O + D * (time + viewSampleSize*0.5); //     // ρ(h) * ds float height = distance(C, P) - _PlanetRadius; float opticalDepthSegment = exp(-height / _ScaleHeight) * ds; //    // D(PA) opticalDepthPA += opticalDepthSegment; ... time += ds; } 

光サンプリング


光の圱響の衚珟に戻るず P 、必芁な倀はセグメントの光孊的厚さだけです  CPの䞊 、

L \巊P \右= \アンダヌセット{\テキスト{耇合透過率}} {\アンダヌブレヌス{\ exp \å·Š\ {-\ベヌタ\巊\ラムダ\右\巊D \巊\オヌバヌラむン{CP} \右+ D \巊\䞊線{PA} \右\右\右\}}} \、\アンダヌセット{\ text {optical depth of} \、ds} {\アンダヌブレヌス{\ rho \巊h \右ds}}


セグメントの光孊的厚さを蚈算するコヌドを移動したす  CPの䞊 lightSamplingず呌ばれるlightSampling 。 名前は、 光線から取られたす。 光線は、 P 倪陜に向かっおいたす。 倧気圏倖に出るポむントを呌び出したした C 。

ただし、 lightSampling関数lightSampling光孊的厚さを蚈算するだけでlightSamplingん  CPの䞊 。 これたでのずころ、倧気の圱響のみを考慮し、惑星自䜓の圹割を無芖したした。 私たちの方皋匏は、光線がから移動する可胜性を考慮しおいたせん P 倪陜に、惑星ず衝突するかもしれたせん。 この堎合、光は実際にはカメラに到達しないため、この時点たでに実行されたすべおの蚈算は適甚されたせん。


䞋の図では、光の圱響がわかりやすい P0 倪陜の光が届かないので無芖する必芁がありたす P0 。 間のポむントを埪環するずき P そしお C lightSamplingは、惑星ずの衝突もチェックしたす。 これは、ネガティブ性のポむントの高さをチェックするこずで実行できたす。

 bool lightSampling ( float3 P, //      float3 S, //    out float opticalDepthCA ) { float _; //     float C; rayInstersect(P, S, _PlanetCentre, _AtmosphereRadius, _, C); //    PC float time = 0; float ds = distance(P, P + S * C) / (float)(_LightSamples); for (int i = 0; i < _LightSamples; i ++) { float3 Q = P + S * (time + lightSampleSize*0.5); float height = distance(_PlanetCentre, Q) - _PlanetRadius; //   if (height < 0) return false; //      opticalDepthCA += exp(-height / _RayScaleHeight) * ds; time += ds; } return true; } 

䞊蚘の関数は、最初にポむントを蚈算したす Cの助けを借りおrayInstersect。次に、圌女はセグメントを分割したす¯PAセグメントに_LightSamples長さのds。光孊的厚さの蚈算は、最も倖偎のルヌプで䜿甚されるものず同じです。

この関数は、惑星ずの衝突が発生した堎合にfalseを返したす。これを䜿甚しお、を眮き換えるこずにより、最も倖偎のルヌプの欠萜コヌドを曎新できたす...。

  // D(CP) float opticalDepthCP = 0; bool overground = lightSampling(P, S); if (overground) { //   // T(CP) * T(PA) = T(CPA) = exp{ -β(λ) [D(CP) + D(PA)]} float transmittance = exp ( -_ScatteringCoefficient * (opticalDepthCP + opticalDepthPA) ); //   // T(CPA) * ρ(h) * ds totalViewSamples += transmittance * opticalDepthSegment; } 

すべおの芁玠を考慮したので、シェヌダヌの準備ができたした。

[泚 レヌン著者のPatreonペヌゞで、完成したシェヌダヌのStandardおよびPremiumバヌゞョンぞのアクセスを賌入できたす。]

Source: https://habr.com/ru/post/J345630/


All Articles