Motor de geometrie în GPU-urile pentru jocuri: utilitate și funcționare

Motor de geometrie în GPU-urile pentru jocuri

Grafica tridimensională este alături de noi de două decenii și, de asemenea, GPU-urile însărcinate cu generarea și trimiterea lor pe ecranul monitoarelor noastre. Astăzi sunt piese extrem de complexe, care sunt alcătuite din diverse elemente, unele noi, altele sunt înăuntru de ani de zile. Cel pe care îl vom acoperi în acest articol este Motorul de geometrie.

Pe măsură ce grafica în timp real avansează, GPU-urile progresează și, odată cu aceasta, problemele noi par a fi rezolvate sau cele vechi sunt mărite. Aceasta înseamnă că soluțiile vechi nu mai sunt eficiente și trebuie create altele noi. Noua generație de grafică nu se va baza doar pe Ray Tracing, ci pe o creștere considerabilă a geometriei scenei. Aici intervine motorul de geometrie, o piesă esențială de îmbunătățit GPU eficiență în această nouă paradigmă.

Un pic de istorie pentru a clarifica confuzia

muri

Din punct de vedere istoric, Geometry Engine sau motorul de geometrie se referea la hardware-ul însărcinat cu efectuarea proceselor de manipulare a geometriei scenei care au loc înainte de rasterizare. Adică, înainte ca triunghiurile care alcătuiesc scena tridimensională să fie convertite în fragmente de pixeli.

Primul motor de geometrie a fost ideea lui Jim Clark la începutul anilor 1980 și a fost începutul legendarei Silicon Graphics. Datorită acestei inovații, a fost posibilă mutarea manipulării scenei 3D de la minicomputere la stații de lucru care erau o fracțiune din dimensiunea și costul celor dintâi.

Abia la sfârșitul anilor 90, jocurile 3D au început să devină populare, dar primele cărți 3D nu aveau un motor de geometrie și se bazau pe Procesor puterea de a calcula geometria scenei. Nu a fost până la lansarea pe PC a primei NVIDIA GeForce că GE a fost complet integrat într-un cip grafic. Fiind supranumit T&L de către NVIDIA marketing.

De-a lungul anilor și de la sosirea Shaders, Motorul de geometrie, ca piesă de hardware, a fost complet înlocuit și acum Unitățile Shader sunt cele care se ocupă de el. Această modificare a avut loc de la DirectX 10, când Geometry Engine ca hardware a dispărut din NVIDIA și AMD GPU-urile, deși recent semnificația sa a fost luată de un nou tip de unitate inclusă în cele mai avansate arhitecturi și despre asta vom vorbi în acest articol.

Asamblatorul primitiv

Vertices Primitivas Fragmentos

Elementele dintr-o scenă de joc tridimensională sunt redate folosind triunghiuri pentru a compune diferitele elemente ale scenei, care sunt alcătuite din vârfuri. Acum, prima etapă a conductei grafice după ce procesorul de comandă a citit lista ecranului este Vertex Shader și numele său se datorează faptului că ceea ce face este să funcționeze cu vârfuri și nu o face cu primitive sau triunghiuri, astfel încât Independent .

Este o unitate numită Primitive Assembler care se ocupă de unirea acestor vârfuri, nu numai pentru a crea triunghiuri, ci pentru a reconstrui diferitele modele care alcătuiesc scena prin unirea diferitelor lor vârfuri. Primitive Assembler este o piesă de funcție fixă ​​în toate GPU-urile care îndeplinesc această funcție în mod automat, fără a fi nevoie de participarea codului în lista ecranului. Simplu și simplu, tot ceea ce rulează pe etapa Vertex Shader din conducta 3D este trimis la Primitive Assembler și de acolo la următorul proces din etapă.

Teselație

În cazul în care există o unitate de teselare în GPU, care este responsabilă pentru subdivizarea vârfurilor, Primitive Assembler rulează imediat după procesul de teselare, deoarece noua configurație a vârfurilor necesită calcule de unire, altele decât vârfurile care vor compune diferite elemente ale scenei.

Tăietorul și îndepărtarea geometriei inutile

Culling Geometry Engine

Într-o scenă tridimensională există o mulțime de primitive grafice sau triunghiuri în scenă. Cu toate acestea, nu toate sunt vizibile pentru jucător în fiecare cadru și, prin urmare, este necesar să aruncați în fiecare cadru toată geometria nevizibilă înainte de etapa de rasterizare. Deoarece fiecare vârf care nu este văzut, dar care nu este aruncat este unul care va fi ulterior rasterizat, texturat și chiar dacă mai târziu este aruncat deoarece există un alt pixel cu prioritate mai mare la desen.

Motivul? Rețineți că, în cadrul conductei 3D tradiționale, un Vertex Shader este executat pentru fiecare vârf din scenă, dar un Pixel Shader pentru fiecare vârf și numărul de pixeli pe triunghi este de obicei un ordin de mărime mai mare. Acesta este motivul pentru care este important să se excludă geometria care nu este vizibilă în scenă. Pentru aceasta, se utilizează doi algoritmi:

  • Primul detectează vârfurile în afara câmpului vizual al jucătorului și se numește View Frustum Culling.
  • Al doilea, în schimb, îi elimină pe cei care se află în câmpul vizual, dar care sunt ascunși de alte elemente mai mari și mai apropiate și se numește Spatele feței.

Acum, procesul Culling poate fi realizat și printr-o funcție fixă ​​și ceea ce face este să elimine complet triunghiurile și chiar obiectele nevizibile. Dar ce se întâmplă când un obiect este parțial vizibil? Ei bine, în funcție de modul în care este implementat hardware-ul, acesta nu îl elimină sau elimină complet obiectul.

Ce este motorul de geometrie într-un GPU actual?

LOD Mesh Shading Geometry Engine

Odată ce problemele din Primitive Assembler și Clipper au fost explicate, trebuie să vorbim despre ceea ce este Geometry Engine, care nu este altceva decât o nouă piesă hardware care reunește aceleași capabilități ca Primitive Assembler și Clipper, dar cu o precizie mai mare. Deoarece are capacitatea de a elimina geometria superfluă, dar la nivel de vârf. Aceasta înseamnă că, dacă un obiect este parțial în afara ecranului sau nu este complet ascuns, ceea ce face este să elimine vârfurile nevizibile și să reconstruiască doar partea vizibilă.

Cealaltă utilitate a Geometry Engine are legătură cu crearea nivelului de detaliu al obiectelor din scenă, unde acestea au niveluri diferite de detalii, niveluri de detaliu sau LOD în limba engleză, în funcție de distanță. Motorul de geometrie are capacitatea de a elimina în mod inteligent vârfurile nevizibile pe baza distanței și astfel să păstreze forma originală a obiectului. Gândiți-vă la aceasta ca la o teselare inversă, unde în loc să măriți numărul de vârfuri pentru a genera detalii, ceea ce faceți este să le micșorați.

Acest lucru este, de asemenea, important în fața problemei supra-teselare, trebuie luat în considerare faptul că atunci când vârfurile sunt teselate, GPU-ul nu are dovada poziției lor reale în spațiul cadru, astfel încât o problemă ajunge să apară, care este supra-teselarea. Ceea ce înseamnă că GPU calculează mai multe vârfuri în obiecte la distanță care nu sunt văzute, dar ale căror date sunt acolo. Motorul de geometrie care are acces la informațiile despre geometria scenei le poate elimina cu ușurință. Să nu uităm că Clipperul tradițional elimină doar ceea ce este în afara imaginii sau ascuns.

Motorul de geometrie din noua conductă DX12 Ultimate

DX12 Ultimate

Cu DirectX 12 Ultimate, partea conductei 3D înainte de rasterizare se schimbă complet, deoarece o bună parte a funcțiilor trec de la realizarea printr-o funcție fixă ​​la realizarea acesteia în unitățile Shader ale GPU. De exemplu, teselarea va atinge un punct care va înceta să mai fie efectuat într-o unitate funcțională fixă ​​pentru a trece la unitățile menționate și, prin urmare, unitatea menționată va dispărea.

În cazul motorului de geometrie, acest lucru nu va dispărea, dar este singurul care are acces la informațiile despre modul în care vârfurile sunt conectate între ele. Orice algoritm care implică accesarea listei de geometrie a scenei înseamnă că trebuie să parcurgeți Geometry Engine, care este cel care controlează lista vârfurilor și relațiile lor între ele.

Privind în viitor, unul dintre lucrurile pe care le vom vedea va fi crearea de structuri BVH pentru Ray Tracing din GPU, elementul hardware care va evolua pentru această sarcină este Geometry Engine. Care astăzi are acces la memoria cache L2 a GPU-ului, unde informațiile vârfurilor sunt stocate temporar. Cantitatea de memorie din GPU este de așteptat să crească considerabil în următorii ani.