3Dモデルを最適化するためにポリゎンを数えるだけでは䞍十分です

画像






メッシュレンダリングの基本を理解するこずにより、さたざたな手法を䜿甚しおレンダリング速床を最適化できたす。



はじめに



いく぀のポリゎンを䜿甚できたすか これは、リアルタむムレンダリング甚のモデルを䜜成するずきにアヌティストが尋ねる非垞に䞀般的な質問です。 この質問は数字だけの問題ではないため、答えるのは困難です。



最初のPlayStationの時代に3Dアヌティストずしおキャリアを始め、埌にグラフィックプログラマヌになりたした。 ゲヌム甚の3Dモデルの䜜成を開始する前に、この蚘事を読みたいず思いたす。 その䞭で考慮される基本的な基瀎は、倚くのアヌティストにずっお有甚です。 この蚘事の情報のほずんどは、毎日の䜜業の生産性に倧きな圱響を䞎えたせんが、䜜成したメッシュをグラフィック凊理ナニットGPUがどのようにレンダリングするかに぀いおの基本的な理解を䞎えたす。



通垞、レンダリングの速床はメッシュ内のポリゎンの数に䟝存したす。 ただし、ポリゎンの数は1秒あたりのフレヌムレヌトFPSず盞関するこずがよくありたすが、ポリゎンの数を枛らした埌でも、メッシュのレンダリングが遅いこずがありたす。 しかし、メッシュの䞀般的なレンダリング方法を理解するこずで、䞀連の手法を適甚しおレンダリング速床を䞊げるこずができたす。



ポリゎンデヌタの衚瀺方法



GPUによるポリゎンの描画方法を理解するには、たずポリゎンの蚘述に䜿甚されるデヌタ構造を考慮する必芁がありたす。 ポリゎンは、頂点ずリンクず呌ばれる䞀連のポむントで構成されたす。 倚くの堎合、頂点は、図1のように、倀の配列ずしお保存されたす。









図1.単玔なポリゎン倀の配列。



この堎合、3次元x、y、zの4぀の頂点から12の倀が埗られたす。 図2に瀺すように、ポリゎンを䜜成するために、倀の2番目の配列は頂点自䜓を蚘述したす。









図2.トップぞのリンクの配列。



互いに接続されたこれらの頂点は、2぀のポリゎンを圢成したす。 頂点1ず2は䞡方の䞉角圢で䜿甚されるため、それぞれ3぀の角床を持぀2぀の䞉角圢は4぀の頂点で蚘述できるこずに泚意しおください。 GPUがこのデヌタを凊理できるように、各ポリゎンは䞉角圢であるず想定されおいたす。 GPUは、䞉角圢を描画するために特別に蚭蚈されおいるため、䞉角圢の䜿甚を期埅しおいたす。 異なる数の頂点を持぀ポリゎンを描画する必芁がある堎合、GPUにレンダリングする前にポリゎンを䞉角圢に分割するアプリケヌションが必芁です。 たずえば、それぞれが4぀の蟺を持぀6぀の倚角圢の立方䜓を䜜成する堎合、3぀の蟺で構成される12の倚角圢の立方䜓を䜜成するよりも効果的ではありたせん。 GPUが描画するのはこれらの䞉角圢です。 ルヌルを芚えおおいおください。ポリゎンではなく䞉角圢を数える必芁がありたす。



前の䟋で䜿甚した頂点デヌタは3次元ですが、これは必須ではありたせん。 2次元で十分ですが、倚くの堎合、他のデヌタ、たずえばテクスチャのUV座暙ず照明の法線などを保存する必芁がありたす。



ポリゎン描画



ポリゎンを描画するずき、GPUは最初にポリゎンを描画する堎所を決定したす。 これを行うために、圌は3぀の頂点が存圚する画面䞊の䜍眮を蚈算したす。 この操䜜は倉換ず呌ばれたす。 GPUでのこれらの蚈算は、頂点シェヌダヌず呌ばれる小さなプログラムによっお実行されたす。



倚くの堎合、頂点シェヌダヌは、アニメヌションの凊理など、他の皮類の操䜜を実行したす。 ポリゎンの3぀の頂点すべおの䜍眮を蚈算した埌、GPUはこのピクセルがどのピクセルにあるかを蚈算し、「フラグメントシェヌダヌ」フラグメントシェヌダヌず呌ばれる別の小さなプログラムでこれらのピクセルを塗り始めたす。 フラグメントシェヌダヌは通垞、ピクセルごずに1回実行されたす。 ただし、たれに、たずえばアンチ゚むリアスを改善するために、ピクセルごずに数回実行できたす。 ほずんどの堎合、フラグメントはピクセルに察応するため、フラグメントシェヌダヌはピクセルシェヌダヌず呌ばれたす図3を参照。









図3.画面に描かれた1぀のポリゎン。



図4は、ポリゎンをレンダリングするずきにGPUによっお実行される䞀連のアクションを瀺しおいたす。









図4. GPUがポリゎンをレンダリングする手順。



䞉角圢を2぀に分割し、䞡方の䞉角圢を描画する堎合図5を参照、手順は図6に察応したす。









図5.ポリゎンを2぀に分割。









図6. GPUが2぀のポリゎンを描画する手順。



この堎合、2倍の倉換ず準備が必芁になりたすが、ピクセルの数は同じたたなので、远加のピクセルをラスタラむズする必芁はありたせん。 これは、ポリゎンの数を2倍にしおも、レンダリング時間が2倍になるずは限らないこずを瀺しおいたす。



頂点キャッシュを䜿甚する



前の䟋の2぀のポリゎンを芋るず、2぀の共通の頂点があるこずがわかりたす。 これらの頂点は2回蚈算する必芁があるず想定できたすが、頂点キャッシュず呌ばれるメカニズムを䜿甚するず、蚈算結果を再利甚できたす。 再利甚のための頂点シェヌダヌの蚈算結果は、キャッシュに保存されたす。キャッシュは、最埌のいく぀かの頂点を含む小さなメモリ領域です。 頂点キャッシュを䜿甚しお2぀のポリゎンを描画する手順を図7に瀺したす。









図7.頂点キャッシュを䜿甚しお2぀のポリゎンを描画したす。



頂点キャッシュのおかげで、共通の頂点がある堎合、2぀のポリゎンを1぀のポリゎンずほが同じ速床で描画できたす。



頂点のパラメヌタヌを扱いたす



頂点を再利甚可胜にするには、䜿甚するたびに頂点を倉曎する必芁がありたす。 もちろん、䜍眮は同じたたにする必芁がありたすが、他のパラメヌタヌも倉曎しないでください。 トップに枡されるパラメヌタヌは、䜿甚する゚ンゞンによっお異なりたす。 䞀般的なオプションは次の2぀です。





UVが3Dオブゞェクトに適甚される堎合、䜜成された継ぎ目は、継ぎ目に沿った頂点を共有できないこずを意味したす。 したがっお、䞀般的な堎合、瞫い目は避けおください図8を参照。









図8. UV瞫合テクスチャヌ。



衚面を適切に照明するために、各頂点には通垞、法線衚面からのベクトルが保存されたす。 共通の頂点を持぀すべおのポリゎンは1぀の法線で定矩されるため、その圢状は滑らかに芋えたす。 これはスムヌズシェヌディングず呌ばれたす。 各䞉角圢に独自の法線がある堎合、ポリゎン間の゚ッゞが顕著になり、衚面は平らに芋えたす。 したがっお、これはフラットシェヌディングず呌ばれたす。 図9は、2぀の同䞀のメッシュを瀺しおいたす。1぀はスムヌズシェヌディングで、もう1぀はフラットシェヌディングです。









図9.スムヌズシェヌディングずフラットシェヌディングの比范。



この滑らかなシェヌディングゞオメトリは18個の䞉角圢で構成され、16個の共通の頂点がありたす。 18個の䞉角圢のフラットシェヌディングでは、頂点が共有されないため、5418 x 3の頂点が必芁です。 2぀のメッシュのポリゎン数が同じであっおも、レンダリング速床は䟝然ずしお異なりたす。



フォヌムの重芁性



GPUは、䞻に倚くの操䜜を䞊行しお実行できるため、高速で動䜜したす。 GPUマヌケティング資料は、倚くの堎合、同時に実行できるGPUの数を決定するパむプラむンの数に焊点を合わせたす。 GPUがポリゎンを描画するず、ピクセルの正方圢を埋めるための倚くのパむプラむンのタスクが提䟛されたす。 これは通垞、8 x 8ピクセルの正方圢です。 GPUは、すべおのピクセルがいっぱいになるたでこれを続けたす。 明らかに、䞉角圢は正方圢ではないため、正方圢内の䞀郚のピクセルは䞉角圢の内偎にあり、他のピクセルは倖偎にありたす。 機噚は、䞉角圢の倖偎にあるものも含め、正方圢内のすべおのピクセルで機胜したす。 正方圢のすべおの頂点を蚈算した埌、機噚は䞉角圢の倖偎のピクセルを砎棄したす。



図10は、描画に3぀の正方圢タむルが必芁な䞉角圢を瀺しおいたす。 蚈算されたピクセルシアンのほずんどが䜿甚され、赀で衚瀺されたピクセルは䞉角圢の境界を超えお砎棄されたす。









図10.䞉角圢を描くための3぀のタむル。



図11のポリゎンずたったく同じピクセル数ですが、ストレッチされおいるため、塗り぀ぶすためにより倚くのタむルが必芁です。 各タむル赀い領域の結果のほずんどは砎棄されたす。









図11.ストレッチ画像のタむルの塗り぀ぶし。



レンダリングされるピクセル数は、芁因の1぀にすぎたせん。 倚角圢の圢状も重芁です。 効率を䞊げるには、長くお狭いポリゎンを避け、蟺の長さがほが同じで、角床が60床に近い䞉角圢を優先するようにしおください。 図12の2぀の平面は、2぀の異なる方法で䞉角圢分割されおいたすが、レンダリングするず同じように芋えたす。









図12. 2぀の異なる方法で䞉角圢分割された衚面。



ポリゎンずピクセルの数はたったく同じですが、巊偎のサヌフェスは右偎よりも長くお狭いポリゎンであるため、レンダリングが遅くなりたす。



再描画



6点の星を描くには、図13に瀺すように、10個のポリゎンのメッシュを䜜成するか、2぀のポリゎンから同じ圢状を描画したす。









図13. 6角の星をレンダリングする2぀の異なる方法。



10個よりも2個のポリゎンを描く方が速いず刀断できたす。ただし、この堎合、星の䞭心のピクセルが2回描画されるため、これはおそらく間違いです。 この珟象はオヌバヌドロヌず呌ばれたす。 本質的には、ピクセルが耇数回再描画されるこずを意味したす。 再描画は、レンダリングプロセス党䜓で自然に発生したす。 たずえば、文字が列によっお郚分的に非衚瀺になっおいる堎合、列が文字の䞀郚ず重なっおいるにもかかわらず、文字党䜓が描画されたす。 䞀郚の゚ンゞンは耇雑なアルゎリズムを䜿甚しお、最終画像では芋えないオブゞェクトのレンダリングを回避したすが、これは難しい䜜業です。 CPUは、描画するためにGPUを䜿甚するよりも、レンダリングする必芁のないものを把握するのが難しい堎合がありたす。



アヌティストずしお、あなたは再描画を取り陀くこずができないずいう事実に同意する必芁がありたすが、芋えない衚面を取り陀くこずは良い習慣です。 開発チヌムず協力しおいる堎合は、ゲヌム゚ンゞンにデバッグモヌドを远加しお、すべおが透過的になるように䟝頌しおください。 これにより、削陀可胜な非衚瀺のポリゎンを芋぀けやすくなりたす。



床に匕き出しの実装



図14は、単玔なシヌンを瀺しおいたす。床に立぀箱です。 床は2぀の䞉角圢のみで構成され、ボックスは10個の䞉角圢で構成されおいたす。 このシヌンの再描画は赀で衚瀺されたす。









図14.床の䞊に立぀匕き出し。



この堎合、GPUは、芋えないずいう事実にもかかわらず、床の䞀郚を匕き出しで床に描画したす。 代わりに、ボックスの䞋の床に穎を䜜成した堎合、図15からわかるように、より倚くのポリゎンを受け取りたすが、再描画ははるかに少なくなりたす。









図15.再描画を避けるための匕き出しの䞋の穎。



そのような堎合、それはすべお遞択に䟝存したす。 堎合によっおは、ポリゎンの数を枛らしお芋返りに再描画する䟡倀がありたす。 他の状況では、再描画を避けるためにポリゎンを远加する䟡倀がありたす。 別の䟋以䞋に瀺す2぀の図は、点が突き出おいる同じ倖芳の衚面メッシュです。 最初のメッシュ図16では、チップは衚面にありたす。









図16.チップは衚面にありたす。



図17の2番目のメッシュでは、再描画の量を枛らすために、チップの䞋の衚面に穎が開けられおいたす。









図17.チップの䞋に穎が開けられおいたす。



この堎合、倚数のポリゎンが穎をカットするために远加され、そのいく぀かは狭い圢状をしおいたす。 さらに、削陀した再描画の衚面はあたり倧きくないため、この堎合、この手法は効果的ではありたせん。



あなたが地面に立っおいる家をモデル化しおいるず想像しおください。 䜜成するには、地球をそのたたにするか、家の䞋の地面に穎を開けたす。 再描画は、家の䞋に穎が開けられおいない堎合に倚くなりたす。 ただし、遞択は、プレヌダヌが家を芋るゞオメトリず芖点によっお異なりたす。 家の土台の䞋に地球を描くず、家の䞭に入っお芋䞋ろすず倧量の再描画が䜜成されたす。 ただし、飛行機から家を芋た堎合の違いはそれほど倧きくありたせん。 この堎合、ゲヌム゚ンゞンにデバッグモヌドを蚭定しお、衚面を透明にしお、プレヌダヌが芋える衚面の䞋に描かれおいるものを確認できるようにするこずをお勧めしたす。



ZバッファヌにZ競合がある堎合



GPUが2぀のオヌバヌラップするポリゎンを描画するずき、どちらが他方の䞊にあるかをどのように刀断したすか 最初のコンピュヌタヌグラフィックス研究者は、この問題の調査に倚くの時間を費やしたした。 Ed Catmell埌にPixar and Walt Disney Animation Studiosの瀟長になったは、このタスクに察する10の異なるアプロヌチを抂説した蚘事を曞きたした。 蚘事の䞀郚では、コンピュヌタヌにピクセルごずに1぀の深床倀を栌玍するのに十分なメモリがある堎合、この問題の解決策は簡単になるず圌は述べおいたす。 1970幎代および1980幎代には、これは非垞に倧量のメモリでした。 ただし、今日のほずんどのGPUは次のように機胜したす。このようなシステムはZバッファヌず呌ばれたす。



Zバッファ深床バッファずも呌ばれたすは次のように機胜したす。各ピクセルに深床倀が関連付けられおいたす。 機噚がオブゞェクトを描画するずき、カメラからピクセルがどれだけ離れお描画されるかを蚈算したす。 次に、既存のピクセルの深床倀をチェックしたす。 新しいピクセルよりもカメラから遠い堎合、新しいピクセルが描画されたす。 既存のピクセルが新しいピクセルよりもカメラに近い堎合、新しいピクセルは描画されたせん。 このアプロヌチは倚くの問題を解決し、ポリゎンが亀差しおも機胜したす。









図18.デプスバッファヌによっお凊理された倚角圢の亀差。



ただし、Zバッファの粟床は無限ではありたせん。 2぀のサヌフェスがカメラからほが同じ距離にある堎合、GPUが混乱し、図19に瀺すように、サヌフェスの1぀をランダムに遞択できたす。









図19.同じ深さの衚面には衚瀺䞊の問題がありたす。



これはZファむティングず呌ばれ、非垞にバグが倚いようです。 倚くの堎合、Zコンフリクトは、カメラからの距離が遠いほど悪化したす。 ゚ンゞン開発者は、この問題を解決するために修正を組み蟌むこずができたすが、アヌティストが十分に近く、互いに重なり合うポリゎンを䜜成した堎合、問題が発生する可胜性がありたす。 別の䟋は、ポスタヌが掛かっおいる壁です。 ポスタヌは、カメラから背埌の壁ずほが同じ深さにあるため、Zコンフリクトのリスクは非垞に高くなりたす。 解決策は、ポスタヌの䞋の壁に穎を開けるこずです。 これにより、再描画の量も削枛されたす。









図20.重耇するポリゎンのZコンフリクトの䟋。



極端な堎合、オブゞェクトが互いに接觊しおいる堎合でもZの競合が発生する可胜性がありたす。 図20は床の匕き出しを瀺しおいたす。匕き出しの䞋の床に穎を開けおいないため、床が匕き出​​しに接する端の隣でzバッファを混同する可胜性がありたす。



描画呌び出しを䜿甚する



GPUは非垞に高速になりたした-非垞に高速なため、CPUがそれに远い぀いおいない可胜性がありたす。 GPUは基本的に1぀のタスクを実行するように蚭蚈されおいるため、すぐに䜜業を開始するのがはるかに簡単です。 グラフィックスは本質的に耇数のピクセルの蚈算に関連しおいるため、耇数のピクセルを䞊行しお蚈算する機噚を䜜成できたす。 ただし、GPUはCPUをレンダリングするために泚文したもののみをレンダリングしたす。 CPUがGPUにデヌタをすばやく「フィヌド」できない堎合、ビデオカヌドはアむドル状態になりたす。 CPUがGPUに䜕かを描画するように呜什するたびに、それは描画呌び出しず呌ばれたす。 最も単玔な描画呌び出しは、1぀のシェヌダヌず1぀のテクスチャセットを含む1぀のメッシュのレンダリングで構成されたす。



フレヌムあたり100の描画呌び出しを転送できる䜎速のプロセッサず、フレヌムあたり100䞇のポリゎンを描画できる高速のGPUを想像しおください。 この堎合、理想的な描画呌び出しは10,000個のポリゎンを描画できたす。 メッシュが100個のポリゎンのみで構成されおいる堎合、GPUはフレヌムごずに10,000個のポリゎンのみを描画できたす。 これは、GPUがアむドル状態になる時間の99です。 この堎合、メッシュ内のポリゎンの数を倱うこずなく簡単に増やすこずができたす。



描画呌び出しの構成芁玠ずそのコストは、特定の゚ンゞンずアヌキテクチャに倧きく䟝存しおいたす。 䞀郚の゚ンゞンは倚くのメッシュを1぀の描画呌び出しに結合できたすバッチ凊理、バッチ凊理を実行したすが、すべおのメッシュは同じシェヌダヌを䜿甚するか、他の制限を持぀必芁がありたす。 VulkanやDirectX 12などの新しいAPIは、プログラムがグラフィックスドラむバヌず通信する方法を最適化するこずでこの問題を解決するために特別に蚭蚈されおおり、単䞀フレヌムで転送できる描画呌び出しの数を増やしたす。



チヌムが独自の゚ンゞンを䜜成しおいる堎合は、゚ンゞンの開発者にドロヌコヌルの制限を尋ねおください。 UnrealやUnityなどの既補の゚ンゞンを䜿甚する堎合は、パフォヌマンスベンチマヌクを実行しお、゚ンゞンの機胜の制限を決定したす。 速床を䜎䞋させるこずなくポリゎンの数を増やすこずができる堎合がありたす。



おわりに



この蚘事が、レンダリングパフォヌマンスのさたざたな偎面を理解するのに圹立぀良い入門曞ずなるこずを願っおいたす。 さたざたなメヌカヌのGPUでは、すべおが独自の方法で少し実装されおいたす。 特定の゚ンゞンずハヌドりェアプラットフォヌムに関連する倚くの予玄ず特別な条件がありたす。 プロゞェクトで掚奚事項を䜿甚するために、レンダリングプログラマヌずのオヌプンな察話を垞に維持したす。



著者に぀いお



Eskil Steenbergは、ゲヌムずツヌルの独立した開発者であり、コンサルタントずしお、たた独立したプロゞェクトで働いおいたす。 すべおのスクリヌンショットは、゚スキルが開発したツヌルを䜿甚したアクティブなプロゞェクトで撮圱されたした。 Quel Solaarの Webサむトず@quelsolaarのTwitterアカりントで、圌の䜜品に぀いお詳しく知るこずができたす。



All Articles