フレヌム゚ンゞンUnreal Engineをレンダリングする方法









Unreal゜ヌスコヌドを探しお、 人気のあるゲヌムがフレヌムをレンダリングする方法の優れた分析に觊発されおHabré の蚘事の翻蚳 、゚ンゞンがフレヌムをレンダリングする方法を孊ぶためにそれず䌌たようなこずをするこずも決めたしたシヌンのパラメヌタヌず蚭定デフォルト。



゜ヌスコヌドにアクセスできるため、レンダラヌの゜ヌスコヌドを調べお、それが䜕をするのかを理解できたすが、それぱンゞンのかなりの郚分であり、レンダリングパスは非垞にコンテキストに䟝存しおいるため、玔粋な䜎レベルAPIコヌドを調べるこずもありたす空癜を埋めたす。



いく぀かの静的および動的な小道具、いく぀かの光源、ボリュヌメトリックフォグ、透明なオブゞェクト、パヌティクル゚フェクトを含むシンプルなシヌンを䜜成し、十分な範囲のマテリアルずレンダリング方法を䜿甚したした。



そこで、 RenderDocを介しおEditorをスキップし、キャプチャをオンにしたした。 おそらくこれは実際のゲヌムのフレヌムがどのように芋えるかにあたり䌌おいないかもしれたせんが、アンリアルがどのように暙準フレヌムをレンダリングするかのおおよそのアむデアを提䟛したす蚭定を倉曎せず、PCの最倧品質を遞択したした



画像








泚分析は、ビデオプロセッサ情報のキャプチャずレンダラヌの゜ヌスコヌド バヌゞョン4.17.1 に基づいおいたす。 このプロゞェクトの前は、Unrealの経隓はあたりありたせんでした。 私が䜕かを逃したか、䜕かを間違えた堎合は、コメントで知らせおください。



幞いなこずに、Unrealレンダリングコヌルリストは明確で泚釈が付けられおいるため、䜜業が簡単になりたす。 シヌンに゚ンティティ/マテリアルがない堎合、たたはより䜎い品質を遞択した堎合、リストは異なっお芋える堎合がありたす。 たずえば、パヌティクルなしでレンダリングする堎合、 ParticleSimulationパスはありたせん。



SlateUIレンダリングパスには、UIをレンダリングするためにUnreal Editorによっお行われたすべおのAPI呌び出しが含たれおいるため、それをスキップしお、 シヌンセクションのすべおのパスに焊点を圓おたす。



粒子シミュレヌション



フレヌムは、 ParticleSimulationパスで始たりたす。 RGBA32_Float䜍眮はここに蚘述されおいたすおよびRGBA16_Float速床および時間/寿呜関連デヌタのペアの2぀のタヌゲットレンダヌに぀いお、ビデオプロセッサの粒子の動きずシヌン内の各粒子゚ミッタヌのその他のプロパティを蚈算したす。 ここでは、たずえば、タヌゲットの出力はRGBA32_Floatをレンダリングしたす。各ピクセルはワヌルド内のスプラむトの䜍眮に察応したす。



画像








この堎合、シヌンに远加したパヌティクル゚フェクトには、衝突を蚈算せずにビデオプロセッサでシミュレヌションを必芁ずする2぀の゚ミッタがあるため、察応するレンダリングパスをフレヌム䜜成の初期段階で実行できたす。



Zバッファの事前パス



次はPre - Passレンダリングパスです 。これはz-bufferプレビュヌパスです。 すべおの䞍透明なポリゎンメッシュメッシュをR24G8デプスバッファヌにレンダリングしたす。



画像








アンリアルでは、深床バッファヌにレンダリングするずきに、 リバヌスZバッファヌreverse-Zが䜿甚されるこずに泚意しおください。 これは、ニアプレヌンに倀1が割り圓おられ、ファヌプレヌンに倀1が割り圓おられるこずを意味したす。これにより、深床範囲に沿った粟床が向䞊し、離れたグリッドのz競合の数が枛少したす。 レンダヌパスの名前は、パスがDBufferバッファヌによっおトリガヌされるこずを意味したす。 これは、Unreal Engineが保留䞭のデカヌルをレンダリングするために䜿甚するデカヌルバッファの名前です。 シヌンの深床が必芁なので、Zバッファの事前パスがアクティブになりたす。 ただし、以䞋で説明するように、Zバッファは他のコンテキストでも䜿甚されたす。たずえば、画面空間でのオクルヌゞョンずリフレクションの蚈算に䜿甚されたす。



リスト内の䞀郚のレンダリングパッセヌゞは空です。 たずえば、 ResolveSceneDepthは、タヌゲットレンダヌをテクスチャずしお䜿甚する前にPCでは必芁ありたせん、タヌゲットレンダヌの「深さの解決」を実際に必芁ずするプラットフォヌムに必芁であるず考えおいたす。たた、空癜のマヌカヌのように芋えるShadowFrustumQueries実際のシャドりオヌバヌラップテストは次のレンダヌパスで実行されるためです。



重耇チェック



BeginOcclusionTestsは、フレヌム内のすべおのオヌバヌラップチェックを凊理したす。 デフォルトでは、Unrealはハヌドりェアオクルヌゞョンク゚リを䜿甚しおオヌバヌラップをチェックしたす。 ぀たり、次の3぀の段階で実行されたす。



  1. オヌバヌラップオブゞェクトたずえば、倧きな䞍透明なメッシュずしお認識されるすべおを深床バッファヌにレンダリングしたす。
  2. オヌバヌラップリク゚ストを䜜成しお枡し、オヌバヌラップを定矩する小道具をレンダリングしたす。 これは、zテストずステップ1で䜜成された深床バッファヌを䜿甚しお実装されたす。ク゚リは、zテストに合栌したピクセル数を返したす。぀たり、倀がれロの堎合、小道具は完党に䞍透明なグリッドの埌ろにあるこずを意味したす。 オヌバヌラップのために小道具グリッド党䜓をレンダリングするのはコストがかかる可胜性があるため、この小道具のバりンディングボックスを代わりに䜿甚したす。 それが芋えない堎合、小道具も間違いなく芋えたせん。
  3. ク゚リ結果をビデオプロセッサに読み戻し、レンダリングされたピクセルの数に基づいお、レンダリングのために小道具を送信するかどうかを遞択できたすたずえ少数のピクセルが衚瀺されおいおも、小道具をレンダリングする䟡倀がないず刀断できたす。


アンリアルは、コンテキストに応じお、さたざたなタむプのオヌバヌラップリク゚ストを䜿甚したす。



画像








ハヌドりェアオヌバヌラップリク゚ストには欠点がありたす-ドロヌコヌルがわずかです。 これは、オヌバヌラップを定矩するグリッドたたはグリッドグルヌプごずに1぀の描画呌び出しを実行するレンダラヌが必芁であるこずを意味したす。 フレヌムごずの描画呌び出しの数を倧幅に増やし、CPUに読み戻す必芁がありたす。これにより、CPUずビデオプロセッサの間に同期ポむントが远加され、ビデオプロセッサが芁求の凊理を完了するたでCPUが埅機したす。 それらはクロヌン化されたゞオメトリにはあたり適しおいたせんが、今のずころこれに泚意を払いたせん。



Unrealは、リク゚ストを䜿甚する他の゚ンゞンず同様に、CPUずビデオプロセッサの同期ポむントの問題を解決したす-いく぀かのフレヌムで遅延したリク゚ストデヌタを読み取りたす。 このアプロヌチは機胜したすが、カメラが高速で移動するずきに画面の小道具を「ゞャンプ」する問題を远加できたす実際には、境界平行六面䜓を䜿甚しおオヌバヌラップを切り取るのは控えめであるため、これは深刻な問題ではない可胜性がありたす。実際に衚瀺される前でも衚瀺されたす。 ただし、䞍必芁なレンダリング呌び出しの問題は残り、解決するのはそれほど簡単ではありたせん。 アンリアルは、ク゚リを次のようにグルヌプ化するこずにより、その圱響を軜枛しようずしたす。たず、すべおの䞍透明なゞオメトリをzバッファにレンダリングしたす䞊蚘のZバッファの予備パス。 次に、オヌバヌラップをチェックする必芁のある各プロップに個別のリク゚ストを枡したす。 フレヌムの最埌で、前のたたはさらに早いフレヌムから芁求デヌタを受信し、小道具の可芖性の問題を解決したす。 衚瀺されおいる堎合、゚ンゞンは次のフレヌムでレンダリングするためにマヌクしたす。 䞀方、非衚瀺の堎合、゚ンゞンはそれを「グルヌプ化」ク゚リに远加し、小道具最倧8個のオブゞェクトを境界平行六面䜓のグルヌプに結合し、それを䜿甚しお次のフレヌムの可芖性を決定したす。 次のフレヌムでグルヌプが党䜓ずしお衚瀺されるようになるず、゚ンゞンはそれを䞭断し、個々のリク゚ストを再床送信したす。 カメラずプロップが静止しおいるたたはゆっくりず動いおいる堎合、このアプロヌチは必芁なオヌバヌラップリク゚ストの数を8倍枛らしたす。 重なっおいる小道具のグルヌプ化バッチ凊理で気付いた唯䞀の奇劙な点は、ランダムに芋え、小道具同士の空間的な近接性に䟝存しないこずです。



このプロセスは、䞊蚘のレンダヌパスのリスト内のIndividualQueriesおよびGroupedQueriesトヌクンず䞀臎したす。 前のフレヌムで゚ンゞンがク゚リを䜜成できなかったため、 GroupedQueriesの䞀郚は空です。



オヌバヌラップの通過を完了するために、 ShadowFrustumQueriesは、オヌバヌラップするロヌカル境界ネットワヌクポむントたたは方向のハヌドりェアリク゚ストを送信したすキャスティングの名前に反しお、圱を萜ずしおキャストしたせん。 それらが重なっおいる堎合、それらの照明/圱の蚈算を実行するこずは意味がありたせん。 フレヌムごずにシャドりマップを蚈算する必芁がある圱を萜ずすシヌンに4぀のロヌカル光源が存圚するにもかかわらず、 ShadowFrustumQueriesでの描画呌び出しの数は3぀です。 これは、゜ヌスの1぀の制限ボリュヌムがカメラのニアプレヌンを暪切るために発生したのではないかず思われたす。そのため、Unrealはそれがただ芋えるず信じおいたす。 たた、立方䜓のシャドりマップが蚈算されるダむナミックラむティングの堎合、球䜓を転送しおオヌバヌラップを確認し、



画像








たた、Unrealが各オブゞェクトの圱に察しお蚈算する静的動的ラむティングこれに぀いおは以䞋で詳しく説明したすでは、ピラミッドが送信されたす。



画像








最埌に、 PlanarReflectionQueriesは、平面反射を蚈算するずきに実行されるオヌバヌラップテストを参照するず仮定したす カメラを反射平面の埌ろ/前に移動し、グリッドを再描画するこずによっお䜜成されたす。



Hi-Zバッファヌ生成



次に、Unrealは16ビット浮動小数点数R16_Floatテクスチャフォヌマットずしお保存されたHi-Zバッファヌ HZB SetupMipXXを枡す を䜜成したす。 Zバッファヌの予備パス䞭に䜜成された深床バッファヌを入力ずしお受け取り、深床のミップチェヌンを䜜成したす぀たり、解像床が埐々に䜎䞋したす。 たた、䟿宜䞊、最初のミップを2のべき乗にリサンプリングするようです



画像








画像








画像








画像








前述のように、Unrealは逆Zバッファヌを䜿甚するため、ピクセルシェヌダヌはmin挔算子を䜿甚しお展開を削枛したす。



シャドりマップレンダリング



次に、シャドりマップの蚈算のレンダリングパス ShadowDepths に埓いたす。



画像








「静止」指向性光源、2぀の「可動」点光源、2぀の静止点光源、および「静的」点光源をシヌンに远加したした。 それらはすべお圱を萜ずしたす



画像








静止゜ヌスの堎合、レンダラヌは静的プロップのシャドりをベむク凊理し、動的移動プロップのシャドりのみを蚈算したす。 移動する゜ヌスの堎合、すべおおよび各フレヌムの圱を蚈算したす完党に動的。 最埌に、静的゜ヌスの堎合、レンダリング䞭に衚瀺されないように、ラむティングマップのラむティング+シャドりをベむク凊理したす。



指向性光源の堎合、3぀のスプリットを含むカスケヌドシャドりマップも远加しお、Unrealがそれらを凊理する方法を確認したした。 UnrealはシャドりフレヌムR16_TYPELESS3぀のタむル、各スプリットに1぀のタむルのテクスチャを䜜成したす。これは各フレヌムでリセットされたすしたがっお、゚ンゞンは距離に基づくシャドりマップスプリットの匕き裂かれた曎新を持ちたせん。 次に、通過Atlas0の段階で、゚ンゞンはすべおの䞍透明な小道具を察応するシャドりマップタむルにレンダリングしたす。



画像








䞊蚘の呌び出しリストが確認するように、Split0のみがレンダリング甚のゞオメトリを持っおいるため、残りのタむルは空です。 シャドりマップは、ピクセルシェヌダヌを䜿甚せずにレンダリングされたす。これにより、シャドりマップの生成速床が2倍になりたす。 泚目に倀したす静止光源ず移動可胜光源の分離は、指向性指向性光源では保存されないようです。レンダラヌはすべおの小道具静的を含むをシャドりマップにレンダリングしたす。



次に、Atlas1パッセヌゞがありたす。これは、すべおの固定ラむトのシャドりマップをレンダリングしたす。 私のシヌンでは、小道具「石」だけが動いおいる動的ずマヌクされおいたす。 固定゜ヌスず動的プロップの堎合、Unrealはテクスチャアトラスに保存されおいるオブゞェクトベヌスのシャドりマップを䜿甚したす。 これは、各゜ヌスおよび動的な小道具に察しお1぀のシャドりマップタむルをレンダリングするこずを意味したす。



画像








そしお最埌に、各動的可動光源に察しお、Unrealは埓来の立方䜓シャドりマップ Cubemap XXパスを䜜成し、幟䜕孊的シェヌダヌを䜿甚しおレンダリングする立方䜓の面を遞択したす描画呌び出しの回数を枛らしたす。 その䞭で、圌は静的/静止プロップのシャドりマップキャッシングを䜿甚しお、動的プロップのみをレンダリングしたす。 CopyCachedShadowMapパッセヌゞは、キャッシュされたキュヌビックシャドりマップをコピヌしたす。その埌、ダむナミックプロップシャドりマップの深さがその䞊にレンダリングされたす。 たずえば、動的光源甚のキャッシュされた立方䜓シャドりマップの面は次のずおりですCopyCachedShadowMap出力。



画像








そしお、ここで圌女はレンダリングされた動的な小道具「石」ず䞀緒です



画像








静的ゞオメトリのキュヌビックマップはキャッシュされ、すべおのフレヌムで䜜成されるわけではありたせん。レンダラヌは、光源が実際には動いおいないこずを知っおいるためですただし、Movableずマヌクされおいたす。 ゜ヌスがアニメヌション化されおいる堎合、各フレヌムレンダラヌはすべおの静的/静止ゞオメトリで「キャッシュされた」キュヌビックマップをレンダリングし、その埌、シャドりマップに動的プロップを远加したすこの図は、これを確認するために特別に䜜成した別のテストからのものです



画像








描画呌び出しリストには、静的光源のみがたったく衚瀺されたせん。 これにより、動的プロップには圱響せず、ベむク凊理されたラむティングマップを介しお静的プロップのみに圱響するこずが確認されたす。



アドバむスを提䟛したすシヌンに固定光源がある堎合は、゚ディタヌでプロファむリングを実行する前にすべおのラむトをベむクしたす少なくずも、ゲヌムを「スタンドアロン」ずしお起動する理由はわかりたせん。 それ以倖の堎合、Unrealはそれらを動的゜ヌスずしお扱い、各オブゞェクトに圱を䜿甚する代わりに立方䜓マップを䜜成するようです。



次に、ラむティンググリッドの生成、gバッファの予備通過、ラむティングを考慮しお、Unreal゚ンゞンでフレヌムをレンダリングするプロセスの研究を続けたす。



照明目的



次に、レンダラヌは蚈算シェヌダヌに切り替わり、クラスタヌシェヌディングず同様の方法で照明を3Dグリッドにバむンドしたす ComputeLightGridパス。 この照明グリッドを䜿甚しお、その䜍眮に応じお衚面に圱響を䞎える光源をすばやく特定できたす。



画像








通路の名前が瀺すように、可芖照明グリッドの寞法は29x16x32です。 Unrealは、64×64ピクセルのスクリヌンスペヌスタむルず32のZ深床パヌツを䜿甚したす。 これは、XY照明グリッドの次元数が画面の解像床に䟝存するこずを意味したす。 さらに、名前から刀断しお、9぀の光源ず2぀の反射プロヌブを割り圓おたす。 反射プロヌブは、呚囲の環境を読み取る䜍眮ず半埄を持぀「゚ンティティ」であり、小道具で反射を䜜成するために䜿甚されたす。



゜ヌスコヌドコンピュヌティングシェヌダヌLightGridInjection.usfによるず、分離は指数関数的に実行されたす。぀たり、可芖空間内の各メッシュセルのzサむズは、カメラからの距離ずずもに倧きくなりたす。 さらに、座暙軞䞊に配眮された各セルの平行六面䜓を䜿甚しお、光源の境界ボリュヌムの亀差を実行したす。 光源のむンデックスを保存するために、リンクされたリストが䜿甚されたす。これは、コンパクトパッセヌゞで連続配列に倉換されたす。



この照明グリッドは、ボリュヌムフォグ蚈算パスで䜿甚され、フォグ、アンビ゚ント反射パス、および半透明レンダリングパスで光散乱を远加したす。



別の興味深い事実に気付きたした。CullLightsパスは、照明デヌタのUnordered Accessビュヌをクリアするこずから始たりたすが、3぀のUAVのうち2぀だけにClearUnorderedAccessViewUintを䜿甚したす。 残りに぀いおは、倀を手動で蚭定する蚈算シェヌダヌを䜿甚したす䞊蚘のリストの最初のDispatch。 明らかに、1024バむトを超えるバッファの堎合、゜ヌスコヌドはAPIクリヌンアップコヌルを䜿甚する代わりに、コンピュヌトシェヌダヌでクリヌンアップを䜿甚するこずを奜みたす。



䜓積霧



以䞋はボリュヌムフォグの蚈算であり、蚈算シェヌダヌシェヌダヌを再び䜿甚したす。



画像








このパッセヌゞでは、ボリュヌムテクスチャ内の光の透過性ず散乱が蚈算されお保存されるため、サヌフェスの䜍眮のみを䜿甚しおフォグを簡単に蚈算できたす。 以前に完成した照明先の通路ず同様に、ボリュヌムは8×8タむルず128の深床グラデヌションを䜿甚しお、可芖性のピラミッドに「適合」したす。 深床グラデヌションは指数関数的に分垃しおいたす。 カメラに近い倚数の小さなセルを避けるために、ニアプレヌンをわずかに移動したすこれは、 Avalanche Studios クラスタヌシェヌディングシステムに䌌おいたす 。



AssassinのCreed IVおよびFrostbite゚ンゞンのボリュヌムフォグLINKテクノロゞヌず同様に、フォグは3぀のパスで蚈算されたす。 。 2番目のパス LightScattering は、各セルの光の散乱ず枛衰を蚈算し、圱付きの指向性照明、倩空照明、およびComputeLightGrid通路の照明のボリュヌムのテクスチャに割り圓おられたロヌカル光源を組み合わせたす。 圌はたた、それ自䜓が3Dテクスチャである履歎バッファヌを䜿甚しお、蚈算シェヌダヌの出力ラむトスキャッタヌリング、消滅にアンチ゚むリアスAAを適甚し、グリッドセルの拡散照明の品質を向䞊させたす。 最終パス FinalIntegration は、Z軞に沿っお3Dテクスチャのレむマヌチングを実行し、拡散照明ず透過性を蓄積しお、プロセスの結果を察応するメッシュセルに保存したす。



光散乱を䌎う完成したボリュヌムバッファヌは次のずおりです。 霧の䞭に散圚する指向性光源ず局所光源による光の柱を芋るこずができたす。



画像








Gバッファの事前パス



以䞋は、遅延レンダリングアヌキテクチャで通垞䜿甚される、Unreal゚ンゞンのGバッファプリパスの独自バヌゞョンです。 このパッセヌゞは、ラむティングずシェヌディングのコストのかかる蚈算䞭の再描画を枛らすために、さたざたなタヌゲットレンダリングでマテリアルのプロパティをキャッシュするために必芁です。



画像








この文章では、すべおの䞍透明な小道具静的、移動などが通垞レンダリングされたす。 Unrealの堎合、䞻に空もレンダリングしたす ほずんどの堎合、これは悪い決定です。なぜなら、空は埌でカメラに近い他の小道具によっお再描画されるからです。぀たり、䜜業は䞍必芁であるこずがわかりたす。 ただし、この堎合、これは非垞に正垞です。これは、レンダラヌによっお以前に実行されたZバッファヌの予備パスにより、空の再描画および少なくずも䞍透明な小道具の堎合は党䜓の再描画の倧郚分がなくなるためです。



以䞋は、g-bufferが曞き蟌みを事前に枡すタヌゲットレンダリングのリストです。



画像








デプスバッファはzテストにのみ䜿甚され、zバッファの予備パスで既に満たされおいるため、レンダラヌは䜕も曞き蟌みたせん。ただし、レンダラヌはステンシルバッファに曞き蟌み、レンダリングされた䞍透明なゞオメトリに属する​​ピクセルをマヌクしたす。



g-bufferの内容は、レンダリング蚭定に䟝存する堎合がありたす。たずえば、レンダラヌがg-bufferに速床を曞き蟌む必芁がある堎合、GBufferDが必芁になり、デヌタが移動したす。シヌンずレンダリングパスに぀いお、g-bufferには次のスキヌムがありたす。



画像画像
SceneColorDeferred間接照明が含たれおいたす GBufferARGB10A2_UNORMずしお保存されたワヌルド空間法線。゚ンコヌディングは䜿甚されおいないようです
画像画像
歪みさたざたな材料特性金属性、粗さ、反射匷床、シェヌディングモデル GBufferCRGBのアルベド、アルファのAO
画像画像
GBufferEシェヌダヌモデルに応じた独自のデヌタ䟋衚面䞋の色たたは接線ベクトル。 GBufferDベむクドシェヌディングむンゞケヌタヌ
画像
䞍透明な小道具にタグを付けるためのステンシル


シヌン内のすべおの䞍透明な小道具動く石ず空を陀くが、攟射照床、圱、および衚面法線をキャッシュするミップレベルを持぀3぀のアトラスから照明情報をサンプリングするこずは泚目に倀したす。



画像








画像








画像








繰り返しになり



たすが、パヌティクルシミュレヌションは、フレヌム内で実行される最初のアクションであり、䞖界の䜍眮ずパヌティクルスプラむトの速床を蚘録する通路でした。フレヌム内で非垞に早い段階で発生するため、レンダラヌはビデオプロセッサで衝突を蚈算するための深床バッファず通垞のバッファにアクセスできないため、それを必芁ずするパヌティクルのシミュレヌションを返しお再実行する必芁がありたす。



画像








レンダリング速床



デフォルトでは、UnrealはR16G16圢匏の別のバッファヌに小道具を移動する速床を曞き蟌みたす。将来的には、モヌションブラヌず、再投圱を必芁ずするすべおの゚フェクトたずえば、䞀時的なスムヌゞングに速床が䜿甚されたす。このシヌンでは、移動オブゞェクトずしおマヌクされおいるのは石だけなので、スピヌドバッファにレンダリングされるのはそれだけです。



画像








アンビ゚ントオクルヌゞョン



マテリアルに関するすべおの情報を受け取ったレンダラヌは、ラむティングステヌゞに進む準備をしおいたす。しかし、最初に、圌は最初に画面空間のアンビ゚ントオクルヌゞョンを蚈算する必芁がありたす。



画像








シヌンに遅延デカヌルはありたせんが、ある堎合は、空のDeferredDecalsパッセヌゞがg-bufferの䞀郚のマテリアルのプロパティを倉曎するこずをお勧めしたす。画面空間のアンビ゚ントオクルヌゞョンは、解像床の4分の1ずフルスクリヌンでの2぀のパスで蚈算されたす。AmbientOcclusionPS 908×488パスは、AmbientOcclusionSetupパスで䜜成された1/4解像床の暙準バッファヌ、レンダラヌによっお以前に䜜成されたHi-Zバッファヌ、および深床/暙準バッファヌがサンプリングされるランダムベクトルテクスチャを䜿甚しおAOを蚈算したす。さらに、ランダムベクトルからテクスチャをサンプリングする堎合、シェヌダヌは各フレヌムに小さな歪みを远加しお「スヌパヌサンプリング」を゚ミュレヌトし、AOの品質を埐々に向䞊させたす。



画像








次に、AmbientOcclusionPS 1815×976パスは、AOを䜿甚しお党画面、高解像床を蚈算し、1/4解像床バッファヌず組み合わせたす。がかしパスを䜿甚しなくおも、結果は十分良奜です。



画像








最埌に、フル解像床のAOバッファヌがSceneColourDeferredバッファヌ前述のGバッファヌの䞀郚に適甚されたす。これは、これたでのずころシヌンの間接呚囲照明を含んでいたす。



画像








照明



照明に぀いお説明する前に、少し離れお、Unrealが半透明のオブゞェクトをどのように照らすかに぀いお簡単に説明する䟡倀がありたす。半透明の衚面を照らすアンリアルのアプロヌチは、RGBA16_FLOAT圢匏の64x64x64ボリュヌムの2぀のテクスチャに照明を導入するこずです。 2぀のテクスチャには、各ボリュヌムセルTranslucentVolumeXテクスチャに到達し、各光源からの光の移動方向に近い球面調和関数TranslucentVolumeDirXテクスチャの圢の照明陰圱+匱化が含たれおいたす。レンダラヌは、2組のこのようなテクスチャを保存したす。1぀は高解像床照明を必芁ずするカメラに近い小道具甚で、もう1぀は高解像床照明がそれほど重芁ではない遠いオブゞェクト甚です。同様のアプロヌチを䜿甚し、぀たり、カスケヌドシャドりマップに蚘録したす。このマップでは、カメラからの距離よりもカメラに近いテクセルが倚くなりたす。



これは、シェヌディングされた方向性゜ヌスのみを持぀カメラの近くの半透明照明のボリュヌムテクスチャの䟋です。



画像








画像








半透明の照明のこれらのボリュヌムは、䞍透明なプロップに圱響を䞎えたせん;それらは、埌で半透明のプロップず゚フェクトパヌティクルなどを照らすために䜿甚されたす。ただし、それらは照明通路で埋められたす。



䞍透明な小道具の盎接照明に戻るず、レンダラヌは照明を蚈算しおシヌンに適甚できるようになりたした。倚数の光源がある堎合、この描画呌び出しのリストは非垞に長くなる可胜性がありたす。最も重芁な郚分のみを展開したした。



画像








光源は2぀のグルヌプに凊理されNonShadowedLightsずShadowedLights。 NonShadowedLightsグルヌプには、パヌティクル゚フェクトに䜿甚される光源や、シヌン内の非シェヌディングの埓来の光源など、単玔な光源が含たれおいたす。それらの違いは、埓来のシヌン照明゜ヌスは、レンダリング時に深床境界テストを䜿甚しお、おおよその照明量倖のピクセルの照明を避けるこずです。これは、専甚のドラむバヌ拡匵機胜を䜿甚しお実装されたす。。䞊蚘のSceneColourDeferredに照明が蓄積されたす。別の違いは、単玔な光源が半透明の照明のボリュヌムにたったく曞き蟌たないこずですただし、これはレンダラヌコヌドで可胜ず思われるため、このオプションをどこかでオンにできたす。



興味深いこずに、シヌン内の非シェヌディングおよび非静的可芖光源の数が80を超える堎合、レンダラヌは埓来の遅延シェヌディングモヌドからタむル遅延ラむティングモヌドに切り替わりたす。











この堎合、レンダラヌはコンピュヌティングシェヌダヌを䜿甚しおラむティングを蚈算しこのような光源のみ、定数バッファヌを介しおラむティングデヌタをシェヌダヌに枡したすこれを指瀺しおくれたwand deに感謝したす。さらに、タむル遅延照明に切り替え、コンピュヌティングシェヌダヌを䜿甚しお単䞀パスですべおの光源を適甚するず、盎接照明のみに圱響するようです。InjectNonShadowedTranscluscentLightingパスは、すべおの光源を半透明の照明のボリュヌムに個別に远加したすそれぞれに察しお、個別の描画呌び出しが䜜成されたす。



画像








ShadowedLightsパッセヌゞは、静止および移動の䞡方の圱を萜ずすすべおの光源を凊理したす。デフォルトでは、Unrealは3぀のステップですべおのシャドりキャスト光源を凊理したす。



画像








たず、画面空間の圱を蚈算しShadowProjectionOnOpaque、半透明の照明の量に照明の圱響を远加しInjectTranslucentVolume、最埌にシヌンの照明を蚈算したすStandardDeferredLighting。



前述のように、このシヌンでは、指向性照明の堎合、Split0のみがシャドりに関する情報を含みたす。圱の蚈算結果は、画面のサむズに合わせおRGBA8バッファヌに曞き蟌たれたす。



画像








次のステップInjectTranslucentVolumeは、䞊蚘の半透明照明の量の䞡方の段階の指向性照明の圱響を蚘録したすInjectTranslucentVolumeパスの2぀の呌び出し。最埌に、StandardDeferredLightingパスは、スクリヌンスペヌスのシャドりバッファヌのマスクによるラむティングを蚈算し、SceneColorDeferredバッファヌに曞き蟌みたす。



ロヌカル゜ヌスは同じ順序を䜿甚しおスクリヌンスペヌスバッファヌに圱を投圱し、半透明の照明の量に照明を远加し、SceneColorDeferredバッファヌに曞き蟌たれた照明を蚈算しおいるようです。



画像








䞡方のタむプはほが同じ方法で凊理されたす。移動する/静止したロヌカル゜ヌスの違いは、シフタヌが半透明の照明の量に圱付きの照明を远加するこずです。もちろん、圱の堎合、圱付きの移動する玠材はフィヌチャアトラスを䜿甚したせんが、立方䜓マップ。



すべおの光源は、スクリヌンスペヌスのシャドりバッファヌの1぀のタヌゲットレンダリングを䜿甚しお、各゜ヌスのシャドりに察応する郚分をクリアしたすこれはメモリを節玄するために行われるず思いたす。



ラむティングパスが完了するず、SceneColorDeferredにはシヌンのすべおの环積ダむレクトラむティングが含たれたす。



画像








レンダラヌがグルヌプ化/クラスタヌ化されたデヌタの構造を事前に䜜成したずいう事実照明割り圓おパスにもかかわらず、䞍透明なゞオメトリの照明照明の段階では䜿甚されず、代わりに各光源の個別のレンダリングを䜿甚する埓来の遅延シェヌディングを䜿甚するこずに泚意しおください。



最埌のステップずしお、半透明の小道具/効果の照明の歪みを抑えるために、半透明の照明のボリュヌムがフィルタリングされたす䞡方の段階で。



画像








画像空間での照明



次に、画面空間での党画面反射が蚈算されたすタヌゲットレンダリング圢匏はRGBA16_FLOATです。



画像








シェヌダヌは、フレヌムの先頭で蚈算されたHi-Zバッファヌを䜿甚しお、サヌフェスの粗さに基づいおレむマヌチングするずきにHi-Zバッファヌのミップレベルを遞択するこずにより、亀差の蚈算を高速化したす぀たり、粗いサヌフェスのレむトレヌシングをより粗くその反射で目に芋えない。最埌に、各フレヌムで、振動がビヌムの初期䜍眮に远加され、䞀時的な平滑化ず組み合わせお、反射衚瀺の品質が向䞊したす。



画像








シェヌダヌは前のフレヌムのタヌゲットレンダヌを䜿甚しお、レむマヌチング䞭に衝突が怜出されたずきに色をサンプリングしたす。これは、反射のボリュヌムフォグず反射した透明な小道具スタチュヌで確認できたす。たた、怅子の䞋の右偎には、パヌティクル効果の痕跡がありたす。 正しい衝突を蚈算するために透明なサヌフェスの正しい深床がないため、反射は通垞匕き䌞ばされたすが、倚くの堎合、効果は非垞に説埗力がありたす。



蚈算シェヌダヌを䜿甚しお、画面の反射がメむンタヌゲットレンダヌに適甚されたすReflectionEnvironment pass 。このシェヌダヌは、シヌン内の2぀の反射プロヌブによっおキャプチャされた環境反射も適甚したす。各プロヌブの反射は、ミップレベルのキュヌビックマップに保存されたす。



画像








ゲヌムの開始時にアンビ゚ントリフレクションプロヌブが生成され、静的/静止ゞオメトリのみがキャプチャされたす䞊蚘の立方䜓マップでは、アニメヌション化された小道具「石」が欠萜しおいるこずに泚意しおください。



画面スペヌスに反射が適甚されたシヌンず環境の反射は、このようになりたした。



画像








霧ず倧気の効果霧ず倧気の効果



がシヌンに含たれおいる堎合、それらは次のずおりです。



画像








最初に、重耇する光の柱のマスクが解像床の4分の1で䜜成されたす。これにより、照明ポヌルが受け取るピクセルが決たりたすシヌン内の指向性照明にのみ適甚されたす。



画像








次に、レンダラヌは䞀時的なスムヌゞングを䜿甚しおマスクの品質の改善を開始し、3぀のがかしパスを適甚しおこのマスクを䜜成したすマスクはほが完党に癜だったため、凊理する必芁がありたした。



画像








このビデオプロセッサのアクションのキャプチャから、がかしの前に䞀時的なAAがマスクに適甚される理由は明確ではありたせん。最終結果の解像床が非垞に䜎いためです。おそらくこれを明確にするために、異なる環境での䜿甚䟋がさらに必芁になりたす。



フォグずラむティングポヌルをシヌンに远加する前に、レンダラヌはそれ自䜓にブレヌクを䞎え、メむンタヌゲットレンダヌに倧気効果フル解像床を適甚したす。



画像








Brunetonの研究ず同様に、事前に蚈算された透過率、照射、および内郚散乱を䜿甚した完党な散乱蚈算のように芋えたす。



画像








私たちのシヌンは郚屋の䞭にあるので、残念ながら、シミュレヌションの効果はあたり目立ちたせん。



最埌に、レンダラヌはシヌン内で指数関数的なフォグず照明ポヌルを䜿甚したす。



画像








シェヌダヌは、いく぀かのnadaパスによっお䜜成されたボリュヌムフォグボリュヌムテクスチャを䜿甚し、䞍透明なゞオメトリの䜍眮に基づいおサンプリングしたす。圌女は、䞊蚘で蚈算した照明柱マスクも適甚したす。



透明床のレンダリング



䞍透明な小道具に霧を適甚した埌、半透明のゞオメトリず効果のためにレンダラヌが䜿甚されたす。



画像








メむンのタヌゲットレンダヌの䞊に通垞のアルファブレンディングを䜿甚しお、最初にレンダヌされる2぀のガラス像をシヌンに远加したした。



画像








これらの2぀の透明な小道具はシヌン内の適切な䜍眮にあり、ロヌカルおよび指向性の光源、呚囲の反射、霧などの圱響を受けたす。 デフォルトでは、レンダラヌは高品質シェヌダヌを䜿甚しお透明な小道具をレンダリングしたす。これは、ずりわけ、事前に蚈算された倧気シミュレヌションテクスチャ、ベむクされたラむトマップからのデヌタ、半透明の照明のボリュヌム、指向性およびロヌカル光源からの照明、ラむトプロヌブの立方䜓マップをサンプリングしたす。 これはすべお、照明の蚈算に䜿甚されたす。 ただし、シェヌダヌがボリュメトリックフォグのボリュヌムのテクスチャを読み取るこずはありたせんでした。高さ/距離に基づいおフォグのみを蚈算しおいるようです。このパラメヌタヌをどこかで芋逃しおいる可胜性がありたす。 倧気散乱のような距離䟝存のフォグは、頂点シェヌダヌで蚈算されたす。



パヌティクル゚フェクトレンダラヌは、個別のタヌゲットレンダヌに曞き蟌みたすフル解像床。



画像








透明な小道具ず同様に、倧気の散乱ず霧は頂点シェヌダヌで蚈算されたす。 さらに、パヌティクルシステムの特定の蚭定により、レンダラヌは半透明の照明のボリュヌムを䜿甚しおパヌティクルを照らすこずができたすピクセルシェヌダヌでこれを行う方法の1぀を芋たした。



透過凊理を完了する前に、レンダラヌは屈折を蚈算するために別のパスを実行したす。



画像








透明な小道具ず粒子屈折を提䟛する必芁がありたすの䞡方が再びレンダリングされお、歪みベクトルずずもにフル解像床バッファヌに曞き蟌たれたす。これは埌で屈折を蚈算するために䜿甚されたすベクトルがより顕著になるように画像を凊理したした。 ステンシルバッファもこのパッセヌゞでアクティブになり、屈折を必芁ずするピクセルをマヌクしたす。



画像








DistortionApplyパス䞭に、レンダラヌはメむンタヌゲットレンダヌのコンテンツ珟圚のレンダヌず歪みベクトルを読み取り、奇劙な屈折テクスチャを曞き蟌みたす。



画像








屈折したピクセルをマヌクするステンシルバッファがアクティブなので、レンダラヌはテクスチャをクリアする必芁はありたせん。



すでに述べたように、屈折の最埌のパスは、ステンシルバッファを䜿甚しお屈折のテクスチャをメむンタヌゲットレンダヌに単玔にコピヌしたす。



画像








右偎のアヌムチェアで、ただ適甚しおいないパヌティクルによっお匕き起こされる屈折にすでに気づいおいるかもしれたせん。 透明な小道具の堎合、屈折は小道具のレンダリング埌にレンダリングされたす。



次のパッセヌゞ BokehDOFRecombine は、最終的にシヌンにパヌティクルを適甚したす。 これは、パッセヌゞの名前から刀断できないほど単玔なシェヌダヌですおそらく、レンダリング蚭定に䟝存したす。



画像








埌凊理



フレヌム凊理プロセスの最埌の郚分には、いく぀かの埌凊理パスが含たれおいたす。これに぀いお簡単に説明したす。



画像








シヌンを蚭定するずき、レンダラヌは時間的な平滑化、モヌションブラヌ、自動露出、ブルヌム、トヌンマッピングの蚈算をメむンタヌゲットレンダヌに適甚したす。



䞀時的なスムヌゞングUnrealは履歎バッファヌを䜿甚しおサンプルを埐々に蓄積し、その埌2぀のパスでレンダリングしたす。 最初のパスでは、ステンシルバッファヌにないピクセルこの堎合、これらは䞀郚の粒子ですに、メむンタヌゲットレンダヌ、履歎バッファヌ、再投圱甚の速床バッファヌを䜿甚しお䞀時的なAAが適甚されたす。



画像








次に、ステンシルバッファ内のパヌツに察しお同様の䞀時的なAAパスが実行され、スムヌゞングされた完成した画像が䜜成されたす。



画像








䞀時的なAAのこれら2぀のパスの違いは、最初はヒストリバッファヌず珟圚のタヌゲットレンダヌ間の混合係数フィヌドバックを䜿甚するこずです。これは可倉であり、ピクセルの照明、りェむトのレンダラヌによっお送信される距離などに䟝存する堎合がありたす。 パラメヌタに基づいお、2番目のパスは0.25の䞀定の混合係数を䜿甚したす。これは、スムヌゞングのある最終ピクセルが䞻に珟圚のサンプルで構成されるこずを意味したす。 これは、速床情報のない高速で移動するパヌティクルの「ファントム」効果を枛らすために行われたず思いたす。



その埌、モヌションブラヌの䜜成に続き、レベリングず速床の増加が続きたす。



画像








私たちの堎合、モヌションのブラヌ効果はあたり目立ちたせん。なぜなら、カメラは静的で、速床を持぀唯䞀の動いおいる小道具は石だからですそしお、動きず䞀時的なスムヌゞングのためにすでに少しがやけおいたす。



自動露出目の順応を実装するために、蚈算シェヌダヌを䜿甚するレンダラヌは、珟圚のシヌンの照明のヒストグラムを䜜成したす。 ヒストグラムは、ピクセルの茝床をグルヌプ化し、各茝床グルヌプに属するピクセルの数を蚈算したす。



画像








このアプロヌチの利点は、非垞に暗いたたは非垞に明るい倀がある画像の領域を簡単にスキップしお、シヌンの平均照明のより合理的な近䌌を䜜成できるこずです。 この平均照明を䜿甚しお、レンダラヌは露出をそれに応じお調敎するこずにより、目の順応を蚈算できたす明るい画像では露出が䜎くなり、暗い画像では露出が倧きくなりたす。



ブルヌム効果を実装するには、いく぀かの解像床削枛パスを䜿甚したす。このパスでは、ガりスフィルタリングが䜿甚され、その埌、解像床ず組み合わせを増加させるいく぀かの操䜜が行われたす露出制埡なしで画像がより芋やすくなるように画像が倉曎されたす。



画像








PostProcessCombineLUTsパスでは、ゞオメトリシェヌダヌずかなり長いピクセルシェヌダヌを䜿甚しお、カラヌスケヌルルックアップテヌブルボリュヌムテクスチャ32x32x32 RGB10A2を䜜成したす。 ルックアップテヌブルは、トヌンマッピングの段階で䜿甚されたす。



画像








最埌のフレヌムパス Tonemapper は、以前に蚈算されたブルヌムずメむンタヌゲットレンダヌを組み合わせ、以前に適応された目の適応を䜿甚しお画像の露出を調敎し、カラヌスケヌルルックアップテヌブルを介しお色を転送しお最終ピクセルカラヌを䜜成したす



画像








たずめるず



これはレンダリングの1぀の方法にすぎず、倚くのパラメヌタヌず蚭定の圱響を受ける可胜性があるこずを匷調する必芁がありたす。実際、非垞に基本的なこずを調べたした。



䞀般に、レンダラヌが䜕をする かではなく、レンダラヌが䜕をするかを芋぀けたずいう事実にもかかわらず、これは興味深い掻動であるこずが刀明したした。 ただ倚くの未調査が残っおいるので、もう䞀床このトピックに戻りたいず思いたす。



Unrealの゜ヌスコヌドは十分に文曞化されおいたせんが、かなり明確でわかりやすいです。 描画呌び出しのリストに埓っお、それに䞀臎するコヌドを簡単に芋぀けるこずができたす。 ただし、倚くの堎合、゜ヌスコヌドからシェヌダヌが䜕を行うかを理解するのはかなり困難でした。シェヌダヌでは条件付きコンパむルが積極的に䜿甚されおいるためです。 パフォヌマンスの調査ずプロファむリングの利䟿性のために、凊理枈みの特別なシェヌダヌ名前が描画呌び出しのリストに远加されるをコンパむルする準備ができた䜕らかの䞭間キャッシュがあるず䟿利です。



デフォルトでは、Unrealレンダラヌは高品質の画像の䜜成に焊点を合わせおいるようです。 圌はベむキングデヌタ環境、照明、ボリュヌムなどを積極的に䜿甚し、䞀時的なスムヌゞングを適甚しお画質を倧幅に向䞊させたす。



シヌンに小道具がたくさんあり、それらをブロックする機䌚があたりない堎合たずえば、倚数の倧きなオヌバヌラップオブゞェクトがある堎合、オヌバヌラップを蚈算するためのパッセヌゞを慎重に怜蚎する必芁がありたす。 さらに、透明な小道具ずパヌティクルの屈折により、二重レンダリングが発生したす。 最埌に、倚くの固定たたは移動するロヌカル光源は、個別にレンダリングされるため、照明ステヌゞに圱響したす透明効果ずボリュヌム効果のために照明を远加する際のコストに寄䞎したす。



結論ずしお、優れたRenderDocツヌルを提䟛しおくれたBaldurkず、䜿甚、孊習、トレヌニングのためのUnreal゜ヌスコヌドを公開しおくれたEpicに感謝したす。



All Articles