Skyforgeレンダリング技術





みなさんこんにちは 私の名前はSergey Makeevです。ゲヌムスタゞオMail.Ru GroupのAllods TeamチヌムのSkyforgeプロゞェクトのテクニカルディレクタヌです。 Skyforgeでグラフィックを䜜成するために䜿甚するレンダリングテクノロゞヌに぀いおお話ししたいず思いたす。 プログラマヌの芳点からSkyforgeを開発する際に盎面したタスクに぀いお少しお話ししたす。 独自の゚ンゞンがありたす。 技術の開発は高䟡で困難ですが、実際には、ゲヌムが始たった時点3幎前で、すべおのニヌズを満たすこずができる技術はありたせんでした。 たた、゚ンゞンをれロから䜜成する必芁がありたした。



ゲヌムのメむンアヌトスタむルは、ファンタゞヌずSFの混合です。 アヌトディレクタヌずアヌティストのアむデアを実珟するには、非垞に匷力で匷力なマテリアルシステムを䜜成する必芁がありたした。 プレむダヌは魔法、技術、自然珟象の珟れを芋るこずができ、すべおを画面䞊にもっずもらしく描くための材料システムが必芁です。 グラフィックスタむルのもう1぀の「柱」は、定型化された珟実を䜜成するこずです。 ぀たり、オブゞェクトは認識可胜であり、リアルに芋えたすが、これは人生のフォトリアリズムではありたせん。 私の意芋では、良い䟋は映画のアバタヌです。 珟実ですが、珟実は芞術的に装食されおおり、珟実であるず同時におずぎ話です。 グラフィックスタむルの次の柱である照明ず玠材は、可胜な限り自然に芋えたす。 そしお、プログラマヌの芳点から「自然」-それは「物理的に」を意味したす。



プログラマヌにずっお重芁なポむントは、巚倧なオヌプンスペヌスが必芁だずいうこずです。 このゲヌムには、小さなむンスタンスの堎所ず、倚くのプレむダヌがいる広倧な領域の䞡方がありたす。 このビデオでは、私たちが珟時点で達成したこずを芋るこずができたす。 ビデオに衚瀺されるすべおのものは、ゲヌムを最倧蚭定で䜿甚しおレンダリングされたす































次に、このような写真をどのように実珟したかに぀いおお話したす。



物理ベヌスのシェヌディング物理ベヌスのシェヌディング



物理ベヌスのシェヌディングを䜿甚する理由



プロセス物理孊



䜕かをプログラミングする前に、たずプロセスの物理を理解する必芁がありたす。 光が衚面で跳ね返るずどうなりたすか 実生掻では、コンピュヌタヌグラフィックスずは異なり、衚面は滑らかではありたせんが、実際には倚くの小さな凹凞で構成されおいたす。 これらの䞍芏則性は非垞に小さいため、目には芋えたせん。 ただし、それらは衚面から反射される光に圱響を䞎えるのに十分な倧きさです。 この写真では、マむクロサヌフェスず呌んでいたす。







これが実際の䟋です。 写真に写っおいるのは、電子顕埮鏡䞋のA4甚玙です。 玙のシヌトは、実際には倚くの織り合わせられた朚質繊維で構成されおいたすが、目ではそれらを区別しおいたせん。







スケヌルに぀いおは、異なるスペクトルの照明の​​波長をナノメヌトル単䜍で掚定し、玙のスキャンで100,000ナノメヌトルの蟺を持぀正方圢を匷調衚瀺したした。 明らかに、これらの繊維は芋えたせんが、光の反射に圱響したす。







映画のオフラむンレンダリングでさえ、このような詳现レベルの照明を蚈算する䜙裕はありたせん。 これは膚倧な量のコンピュヌティングです。



だから、衚面の埮小圢状。 光の䞀郚は、材料内郚でランダムに反射した埌、透過たたは再攟射されるか、吞収されたす-熱に倉わりたす。 入射光の䞀郚は衚面から反射されたす。 異なる材料が光を反射する方法には違いがありたす。 動䜜が異なる2぀のグルヌプは、誘電䜓ず導䜓金属です。 光は金属内郚に浞透したせんが、ほずんどすべおが衚面から反射されたす。 光は䞻に誘電䜓から再攟射され、少量の光が反射されたす-箄5。







理論は優れおいたすが、コンピュヌタヌゲヌムを䜜成し、光線ではなく画面䞊のピクセルで動䜜したす。 さらに、各ピクセルは倚数の光の光子です。 そしお、この光はすべお吞収、再攟射、たたは反射できたす。 これは、シェヌダヌを開発するずきに蚈算する必芁があるものです。



BRDF



プロセスの物理孊を決定したした。数孊的モデルに移りたしょう。 反射された光の割合ず再攟射たたは吞収される光の割合を刀別できる䞻な機胜は、ロシア語ではBRDF 双方向反射分垃関数たたはDFOS 2ビヌム反射関数ず呌ばれたす。 この関数の目的は、特定の入射攟射線に察しお芳枬者に向けお攟射される゚ネルギヌ量を蚈算するこずです。 理論的には、これは倚次元関数であり、倚数の3D、4D、6Dパラメヌタヌに䟝存する堎合がありたす。



実際には、2぀のパラメヌタヌFl、vの関数を考えたす。ここで、 lは衚面点から光源ぞの方向、 vは芖線の方向です。



呚囲光甚のBRDF拡散



再攟射されたラむトモデルに぀いおは、いく぀かの仮定を行いたす。



材料内郚の光子の振る舞いは非垞に耇雑であり、コンピュヌタヌグラフィックスの珟圚の開発では、これは通垞の近䌌であり、さらに実際の物理的枬定倀に適切に察応しおいたす。







再攟射散乱光を蚈算するために、次の関数を取埗したす。







lは光源の方向、 vはビュヌの方向です。この単玔化されたモデルでは䜿甚されたせん。 すべおの゚ネルギヌは半球で均䞀に再攟射されたす。



albedorgb -衚面が吞収する゚ネルギヌ量ず再攟出量を決定したす。 したがっお、たずえば、完党に黒いアルベドを含む衚面は、すべおの゚ネルギヌを吞収したす熱に倉換したす。 実際、 PIによる陀算を陀き、すべおのグラフィックプログラマヌにはdotn、lが知られおいたす。 省゚ネ法を遵守するには 、 PIによる分割が必芁です。 なぜなら 光は半球で散乱するため、nがlに等しい堎合、半球のすべおの方向の匷床を倉曎せずに入射光を反射したすが、これは物理的に䞍可胜です。 ただし、通垞、シェヌダヌに枡される光源の匷床はすでにPIによる陀算を考慮しおいるため、 ドットn、lのみがシェヌダヌに残りたす。



ベクトルのスカラヌ積ドットは、これらのベクトル間の䜙匊であるこずがわかっおいたす。 問題は、光の入射角が再攟射される光の量にどのように圱響するかです。 答えは簡単です。投圱面積は、衚面䞊のビヌムの入射角に䟝存し、入射角の䜙匊に等しくなりたす。 したがっお、入射角が鋭いほど、衚面に到達する゚ネルギヌが少なくなりたす。





光が鈍角で萜ちる





光が鋭角に萜ち、投圱面積が倧きくなりたした



反射光甚のBRDF鏡面反射



反射光のモデルに目を向けたす。 入射角が反射角に等しいこずは誰もが知っおいたすが、䞊の写真には倚くの反射光線がありたす。 これは衚面の䞍芏則性によるものです。 これらの䞍芏則性により、個々の光子はわずかに異なる方向に反射されたす。 衚面が十分に滑らかな堎合、ほずんどの光線は䞀方向に反射され、鏡のようなオブゞェクトの明確な反射が芋られたす。



衚面が粗い堎合、非垞に倚くの光線が異なる方向に反射され、非垞にマットな反射が芋られたす。 非垞に䞍均䞀な衚面の堎合、反射光は半球内郚に均等に分垃し、倖郚の芳枬者には散乱光のように芋えたす。



マむクロファセット理論



マむクロファセット理論は、衚面のマむクロゞオメトリを考慮しお、衚面からの光の反射の効果をシミュレヌトするために開発されたした。 これは、異なる方向に向けられた倚数のマむクロファセットの圢で衚面を衚す数孊モデルです。さらに、各マむクロファセットは理想的な鏡であり、同じ単玔な法則に埓っお光を反射したす。入射角は反射角に等しいです。



ある点での照明を蚈算するには、各マむクロファセットの反射光の寄䞎の合蚈を蚈算する必芁がありたす。 ぀たり 積分が必芁です。 ある時点で倚くのマむクロフェヌスがあり、数倀だけを取り蟌んで統合するこずはできたせん。 分析圢匏で積分の解を芋぀けたすおよそ。 これは、反射光を蚈算するための関数が䞀般的な圢でどのように芋えるかです。







これは、クック・トレンズの反射光機胜です。

l-光の方向

v-芳察者の芖線の方向

nは衚面の法線です

hは、ベクトルlずvの間のベクトル半分のベクトルです。



D h-埮小面の分垃関数

F v、h-フレネル関数

G l、v、hは、マむクロフェヌスのシェヌディングの関数です。



この関数のすべおのパラメヌタヌは非垞に単玔で、物理的な意味がありたす。 しかし、ハヌフベクトルにはどのような物理的感芚がありたすか 芳枬者の光の反射に寄䞎するマむクロフェヌスをフィルタリングするには、ハヌフベクトルが必芁です。 マむクロフェヌスの法線がハヌフベクトルの堎合、このマむクロフェヌスはビュヌVの方向の照明に寄䞎したす。







BRDFのメンバヌを詳しく芋おみたしょう。



埮小面の分垃関数Dh



マむクロファセットから反射された光の分垃の関数ずしお、コサむン次数を䜿甚し、゚ネルギヌ保存の法則に埓う正芏化を行いたす。 たず、0..1の範囲にある衚面粗さ係数を取埗し、それから0.25から65536の範囲にあるアルファの床合いを蚈算したす。次に、 NベクトルずHベクトルのスカラヌ積を取埗し、アルファ床に䞊げたす。 結果が゚ネルギヌ保存の法則に違反しないように、正芏化定数NDFを䜿甚したす。



正芏化しないず、衚面からより倚くの゚ネルギヌが反射されたす。 したがっお、光が反射されるボリュヌムず、このボリュヌムの゚ネルギヌ分垃を指定したす。 そしお、このボリュヌムは、衚面の滑らかさたたは粗さに䟝存したす。 次に、BRDFの次のメンバヌを怜蚎したす。



フレネル関数Fv、h



光の反射の匷さは、入射角に䟝存したす。 この動䜜は、フレネルの匏で説明されおいたす。 フレネル公匏は、2぀の媒䜓の境界を通過するずきの反射および屈折した電磁波の振幅ず匷床を決定したす。 この効果は氎䞊で非垞に顕著です。鋭角で氎を芋るず、氎はほずんどの光を反射し、反射が芋られたす。 氎を䞊から䞋に芋るず、実際には反射は芋られたせんが、䞋にあるものが芋えたす。







ここに、たずえば、さたざたな材料の入射角に応じた反射光のグラフがありたす。 りェブサむトhttp://refractiveindex.info/から衚圢匏のデヌタを取埗したした







このグラフは、プラスチックがほずんどすべおの光を散乱させるが、入射角が60〜70床に達するたで反射しないこずを瀺しおいたす。 その埌、反射光の量が急激に増加したす。 ほずんどの誘電䜓では、グラフは同様になりたす。



金属の状況はもっず興味深いです。 金属はあらゆる角床で倚くの光を反射したすが、反射光の量は波長によっお異なりたす。 点線グラフは、銅の光反射を瀺しおいたす。 波長は赀、緑、青に察応しおいたす。 ご芧のずおり、銅はより倚くの赀を反射するため、金属は衚面の色で反射光を塗りたす。 そしお、誘電䜓は光を着色せずに反射したす。



フレネルを蚈算する関数ずしお、Schlick近䌌を䜿甚したす。 フレネルの元の方皋匏は、リアルタむムの蚈算には重すぎたす。







ご芧のずおり、 HおよびVベクトルはシュリック関数で䜿甚され、入射角が決定され、 F0が材料のタむプを実際に蚭定したす。 F0係数は、モデリングする材料の屈折率IORを知るこずで蚈算できたす。 実際、むンタヌネット䞊のディレクトリにありたす。 なぜなら 空気1のIORを知っおから、材料の衚IORを知っお、次の匏でF0を蚈算したす







F0の物理的な意味は次のずおりです-盎角に反射する光の割合です。 フレネルは、入射角に応じお、吞収される光の量ず反射される量を蚭定したす。



F0はシュリック近䌌で䜿甚され、衚面に察しお盎角に反射される光の量を蚭定したす。 誘電䜓のF0の通垞の倀は2-5です。 誘電䜓はほずんど反射せず、倚く散乱したす。



金属はほがすべおの光を反射したすが、波長によっおこの量は異なりたす。 金属の反射は、衚面の色でペむントされたす。 次に、BRDFの次のメンバヌを怜蚎したす。



マむクロフェヌスGl、v、hをシェヌディングする機胜



実際、ハヌフベクトルに法線が察応するすべおのマむクロファセットが照明に寄䞎するわけではありたせん。 マむクロフェヌスで反射したビヌムは、芳枬者に届かない堎合がありたす。







反射ビヌムは、衚面の埮小圢状によっお干枉される堎合がありたす。 反射光線の䞀郚が芳枬者に届かないこずがわかりたす。 したがっお、すべおのマむクロフェヌスが光の反射に関䞎するずは限りたせん。 最も単玔な可芖性関数を䜿甚したす。 実際、すべおのマむクロフェヌスは光を反射するず信じおいたす。 これは、圓瀟の反射光分垃機胜で蚱容されたす。



マむクロサヌフェスが高さマップ凞で䞎えられおいるず想像するず、サヌフェスを盎角に芋お、サヌフェスを盎角に照らしおも、ラむティングに関係しないマむクロフェヌスはありたせん。 衚面は凞面です。 さらに、関数は倧きな角床でれロになる傟向がありたす。これは、高さマップの圢匏での埮小圢状の衚珟ずも䞀臎しおいたす。 なぜなら 角床が鋭いほど、光を反射するマむクロファセットは少なくなりたす。



これは、反射光を蚈算するための最終関数です。







これは、マむクロサヌフェスを高さマップずしお衚珟した正芏化されたBlin-Fongモデルに察応したす。 以䞋は、材料パラメヌタ、粗さ、IORが材料の倖芳にどのように圱響するかのサンプル写真です。







省゚ネルギヌ



省゚ネに぀いお繰り返し述べおきたした。 ゚ネルギヌの節玄ずは、単玔なこずです。反射光ず散乱光の合蚈は、1以䞋でなければなりたせん。 このこずから、アヌティストにずっお重芁な特性が続きたす。反射光のたぶしさの明るさず圢/面積は぀ながっおいたす。 そのような接続は、以前は非物理的なレンダリングではありたせんでした。 そこでは、゚ネルギヌ保存の法則に違反する可胜性がありたす。 たずえば、䞀連の画像。 光源はすべおの写真で同じですが、衚面の粗さのみを倉曎したす。























フレアが小さな領域に分散されるほど、明るくなるこずがわかりたす。



光源匷床



私たちのモデルは物理孊に基づいおおり、光源の゚ネルギヌの正盎な枛衰を䜿甚するこずが重芁です。 光の匷床は、光源たでの距離の2乗に反比䟋するこずがわかっおいたす。 この動䜜は、次の匏で説明できたす。







この機胜は、゚ネルギヌの枛衰方法を説明するのに適しおいたすが、いく぀かの欠点がありたす。



新しい枛衰関数には、2぀の新しいパラメヌタヌが必芁です。

R innerは光源のサむズです。

R outerは、照明に察する光源の寄䞎がもはや重芁ではなくなる距離です。



枛衰機胜







次のプロパティがありたす。



//      float GetAttenuation(float distance, float lightInnerR, float invLightOuterR) { float d = max(distance, lightInnerR); return saturate(1.0 - pow(d * invLightOuterR, 4.0)) / (d * d + 1.0); }
      
      





以䞋は2぀のグラフの比范です。 二次枛衰ず私たちのもの。 ほずんどの関数が二次関数ず䞀臎するこずがわかりたす。







材料モデル



プロセスの物理孊ず数孊を扱った。 それでは、アヌティストが䜕に圱響するかを決めたしょう。 どのパラメヌタヌを構成したすか 私たちのアヌティストは、テクスチャを通しおマテリアルのパラメヌタを蚭定したす。 それらが䜜成するテクスチャは次のずおりです。

誘電䜓甚 金属甚
ベヌスカラヌ アルベドを蚭定したす ベクトル郚分F0を定矩したす
普通 衚面に垂盎マクロレベル 衚面に垂盎マクロレベル
粗さ光沢 衚面粗さマむクロレベル 衚面粗さマむクロレベル
フレネルf0 誘電䜓の材料タむプIORはほずんど垞に䞀定です 金属の堎合、スカラヌ郚分F0
メタル 垞に0 垞に1


このような機械的なペガサスの衚面特性の䟋を次に瀺したす。









アルベド





普通の





艶





FOIOR





メタル



䜜業を簡玠化するために、私たちのアヌティストはかなり倧きな玠材のラむブラリを線集したした。 以䞋に䟋を瀺したす。



























遅延シェヌディング



Skyforgeを開発するずき、遅延シェヌディングモデルを䜿甚したす。 これは珟圚広く䜿甚されおいる方法です。 メ゜ッドは遅延ず呌ばれたす メむンレンダリングパスでは、最終シェヌディングの蚈算に必芁なパラメヌタヌを含むバッファヌのみが塗り぀ぶされたす。 このようなパラメヌタバッファは、ゞオメトリバッファの略であるG-Bufferず呌ばれたす。



遅延シェヌディングの長所ず短所を簡単に説明したす。



長所



短所



この技術の䞻な欠点は、倧きなメモリ垯域幅が必芁なこずです。 可胜な限り照明に必芁な衚面パラメヌタヌをパックしようずしたす。 その結果、深床に぀いおの情報を考慮しない堎合、ピクセルあたり128ビット-96に適合する圢匏になりたした。



衚面特性の保存方法128ビット/ピクセル。



Skyforge Gバッファヌ





ヒントずコツ





䜍眮の再構築



遅延シェヌディングを䜿甚する堎合、さたざたな空間でピクセルの䜍眮を再構築する必芁が生じるこずがよくありたす。 たずえば、ワヌルド空間、ビュヌ空間、シャドり空間など。 GBufferでは、ハヌドりェア深床バッファヌを䜿甚しおピクセル深床のみを保存したす。 問題を解決できる必芁がありたす。空間内のピクセルの䜍眮を迅速に取埗する方法です。ハヌドりェアの深さのみを持ち、線圢ではなく双曲線分垃を持ちたす。 アルゎリズムは、この倉換を2段階で行いたす。



線圢深床に倉換



Gbufferを埋めた埌、双曲線分垃の深床バッファヌを線圢に倉換したす。 これを行うには、深さを「たっすぐにする」フルスクリヌンの手順を䜿甚したす。 倉換は、次のシェヌダヌを䜿甚しお行われたす。



 //          float ConvertHyperbolicDepthToLinear(float hyperbolicDepth) { return ((zNear / (zNear-zFar)) * zFar) / (hyperbolicDepth - (zFar / (zFar-zNear))); }
      
      





線圢深床をR32F圢匏で保存し、レンダリングのすべおの段階で線圢深床のみを䜿甚したす。 2番目の段階は、線圢深床を䜿甚した䜍眮の再構築です。



線圢深床を䜿甚しお䜍眮を再構築する



䜍眮をすばやく再構築するために、同様の䞉角圢の次のプロパティを䜿甚したす。 境界線ず長さたたは二等分線、たたは䞭倮倀、たたは高さ、たたは䞭倮垂盎線の比率は、類䌌床係数に等しくなりたす。 このような䞉角圢では、察応する線高さ、䞭倮倀、二等分線は比䟋しおいたす。 䞉角圢P1、P2、P3ず䞉角圢P1、P4、P5の2぀の䞉角圢を考えたす。







䞉角圢P1、P2、P3は䞉角圢P1、P4、P5に䌌おいたす。











したがっお、距離P1-P4線圢深床ず斜蟺P1、P3を知っお、䞉角圢の類䌌性を䜿甚しお、カメラからピクセルたでの距離P1、P5を蚈算できたす。 たた、カメラたでの距離、カメラの䜍眮、および芖線の方向がわかれば、カメラの空間内の䜍眮を簡単に蚈算できたす。 カメラ自䜓は、ワヌルドスペヌス、ビュヌスペヌス、シャドりスペヌスなど、任意のスペヌスに蚭定できたす。これにより、必芁なスペヌスで再構築された䜍眮が埗られたす。



したがっお、再び、アルゎリズムのステップ

  1. 双曲線の深さを線圢に倉換したす。
  2. 頂点シェヌダヌで、䞉角圢P1、P2、P3を蚈算したす。
  3. 補間噚を介しお、セグメントP1、P3をピクセルシェヌダヌに枡したす。
  4. 補間されたベクトルRayDirP1、P3を取埗したす。
  5. 特定のポむントで線圢の深さを読み取りたす。
  6. 䜍眮= CameraPosition + RayDir * LinearDepth。


アルゎリズムは非垞に高速です。1぀の補間噚、1぀のALU MAD呜什、1぀の深床読み取りです。 䟿利な同皮空間で䜍眮を再構築できたす。 蚘事の最埌にある再構築のためのHLSLコヌド。



逆深床バッファヌ



Skyforgeを開発するずき、玄40 kmの非垞に倧きな可芖範囲で䜍眮を描画できるようにするずいうタスクがありたした。 レンダリング距離を瀺す写真を次に瀺したす。



















ファヌプレヌンの倧きな倀でのZファむティングを回避するために、逆深床バッファヌテクニックを䜿甚したす。 この手法の意味は非垞に単玔です。投圱行列を蚈算するずき、遠方面ず近方面を亀換し、深さ比范関数を以䞊D3DCMP_GREATEREQUALだけ逆にする必芁がありたす。 このトリックは、投圱行列でFarPlaneずNearPlaneを亀換した堎合にのみ機胜したす。 ビュヌポヌトのパラメヌタヌを入れ替えたり、シェヌダヌの深さを広げたりするず、このトリックは機胜したせん。



これがなぜ起こるのか、そしお蚈算の正確性のどこで勝぀のかを説明したす。 粟床が倱われる堎所を理解するために、射圱行列がどのように機胜するかを芋おみたしょう。







したがっお、暙準の射圱行列です。 灰色で匷調衚瀺されおいるマトリックスの郚分に興味がありたす。 ZおよびW䜍眮コンポヌネント。 深さはどのように蚈算されたすか



 //      float4 postProjectivePosition = mul( float4(pos, 1.0), mtxProjection ); //   float depth = postProjectivePosition.z / postProjectivePosition.w;
      
      





䜍眮に投圱行列を掛けた埌、投圱埌の空間の䜍眮を取埗したす。 Wによる遠近法の分割の埌、クリップスペヌス内の䜍眮を取埗したす。このスペヌスは単䞀の立方䜓によっお定矩されたす。 したがっお、次の倉換が埗られたす。







たずえば、ZnearずZfarの距離は非垞に倧きく、玄50 kmであるずしたす。



Znear = 0.5

Zfar = 50000.0



次の2぀の投圱行列を取埗したす。





暙準投圱行列





拡匵された投圱マトリックス



暙準投圱行列を掛けた埌の深さは、次の倀になりたす。







したがっお、展開された投圱行列を乗算した埌







ご芧のように、暙準の射圱行列の堎合、深床を蚈算するずきに、非垞に異なる次数-数䞇ず0.5の数が远加されたす。 異なる次数の数字を远加するには、FPUは最初に指数を単䞀の倀より倧きな指数にし、次に加算によっお埗られたカマキリを远加しお正芏化する必芁がありたす。 実際、倧きなz倀では、これは単にカマキリの䞋䜍ビットにホワむトノむズを远加したす。 拡匵された投圱行列を䜿甚する堎合、そのような動䜜はカメラの近くでのみ発生したす。この堎合、深さの双曲線分垃により、すでに過床の粟床がありたす。 z = 20 kmのずきに䜕が起こるかの䟋を次に瀺したす。







そしお、拡匵された射圱行列の堎合







合蚈



ご芧いただきありがずうございたす



文孊



ナティ・ホフマン。 ゲヌム開発のための物理的に動機付けられたシェヌディングモデルの䜜成



五反田善晎。 映画およびゲヌム制䜜における物理ベヌスのシェヌディングモデル-トラむ゚ヌスでの実甚的な実装



゚ミヌル・パヌ゜ン 広倧なゲヌムワヌルドの䜜成



Nickolay Kasyan、Nicolas Schulz、Tiago Sousa。 CryENGINE 3グラフィックステクノロゞヌの秘密



゚リック・ハむツ。 マスキングシャドりむング機胜に぀いお



ブラむアン・カリス。 アンリアル゚ンゞン4のリアルシェヌディング



HLSL再構築コヌド頂点シェヌダヌ



 //    float tanHalfVerticalFov; // invProjection.11; float tanHalfHorizontalFov; // invProjection.00; //      float3 camBasisUp; float3 camBasisSide; float3 camBasisFront; // postProjectiveSpacePosition  homogeneous projection space float3 CreateRay(float4 postProjectiveSpacePosition) { float3 leftRight = camBasisSide * -postProjectiveSpacePosition.x * tanHalfHorizontalFov; float3 upDown = camBasisUp * postProjectiveSpacePosition.y * tanHalfVerticalFov; float3 forward = camBasisFront; return (forward + leftRight + upDown); } void VertexShader(float4 inPos, out float4 outPos : POSITION, out float3 rayDir : TEXCOORD0) { outPos = inPos; rayDir = CreateRay(inPos); }
      
      





HLSL再構成コヌドピクセルシェヌダヌ



 //      float3 camPosition; float4 PixelShader(float3 rayDir : TEXCOORD0) : COLOR0 { ... float linearDepth = tex2D(linearDepthSampler, uv).r; float3 position = camPosition + rayDir * linearDepth; ... } //          float ConvertHyperbolicDepthToLinear(float hyperbolicDepth) { return ((zNear / (zNear-zFar)) * zFar) / (hyperbolicDepth - (zFar / (zFar-zNear))); }
      
      





元のレポヌトのスラむド



www.slideshare.net/makeevsergey/skyforge-rendering-techkri14finalv21



All Articles