Direct3D 11

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită la 2 noiembrie 2014; verificările necesită 34 de modificări .

Direct3D 11 (D3D11) este o componentă a interfeței de programare a aplicațiilor ( API ) a  DirectX 11, a 11-a versiune a Direct3D , succesorul Direct3D 10/10.1 . Direct3D 11 oferă funcții pentru sistemul de operare și aplicații pentru a interacționa cu driverele plăcii grafice . Aceste caracteristici nu sunt legate de următorul sistem de operare din gama Windows ( Windows 7 ) și sunt disponibile în Windows Vista . Parțial, D3D11 funcționează pe plăci video de nivel Direct3D 9-10.

Primele versiuni de previzualizare au apărut în noiembrie 2008. Versiunea finală oficială a fost lansată pe 22 octombrie 2009, ca parte a Windows 7 . Pe 28 octombrie 2009, DirectX 11 a devenit disponibil oficial pentru Windows Vista și Windows Server 2008 prin descărcare prin Windows Update . [unu]

Teselație

D3D11 adaugă 3 etape suplimentare conductei de randare, al căror scop este de a tesela eficient suprafețele.

Conducta D3D11 include trei etape noi între etapele vertex și geometry shader . Două dintre ele sunt programabile (etape de shader de cocă și de shader de domeniu) și una este configurabilă (etapa de tesselare).

Conducta prezentată funcționează cu grile definite de pete de suprafață. Principalele primitive ale D3D11 sunt patch-uri triunghiulare și pătrate. Forma fiecărui plasture este determinată de numărul de puncte de control. În vertex shader, aceste puncte sunt transformate, decojite și/sau transformate secvenţial.

Shaderul shell este numit pentru fiecare patch. Punctele de întrerupere ale corecțiilor din vertex shader sunt folosite ca intrare. Shaderul shell are două utilizări principale. Prima (opțională) este conversia punctelor de întrerupere de la o reprezentare la alta. De exemplu, vă permite să implementați metoda prezentată în Aproximarea suprafețelor de subdiviziune Catmull-Clark cu pete bicubice . După acest shader, punctele de control sunt trimise direct mai departe, ocolind tesselator. O altă utilizare este calcularea unui parametru de teselare adecvat, care este apoi trecut la etapa de teselare. Această abordare permite teselarea adaptivă, care poate fi utilizată în cazul nivelurilor de detaliu dependente de vizualizare (LOD). Parametrul de teselație este definit pentru fiecare față a petecului și variază de la 2 la 64. Aceasta înseamnă că fiecare față a unui petec triunghiular (sau pătrat) poate fi împărțită în 2 (sau maximum 64) fețe.

Etapa tesselator este reprezentată de un set fix de funcții (foarte configurabile) care utilizează parametrul tesselation pentru a subdiviza patch-ul în mai multe triunghiuri sau quad-uri. Tesselator nu are acces la punctele de întrerupere - toate deciziile de împărțire sunt luate pe baza parametrilor de configurare și de tesselare trecuți de la shell shader. Fiecare vârf după etapa de teselare este trecut la shaderul de domeniu și sunt transmise numai coordonatele de parametrizare.

Domain shader operează pe coordonatele de parametrizare ale patch-ului pentru fiecare vârf separat, deși este posibil să accesați punctele de control transformate pentru întreg patch-ul. Shaderul de domeniu trimite toate informațiile despre vârf (poziție, coordonatele texturii etc.) către geometry shader (sau către etapa de tăiere dacă nu este specificat nici un geometry shader). În esență, evaluează reprezentarea suprafeței în fiecare punct. În această etapă, se poate aplica metoda cartografierii deplasării.

Calculați shadere și memorie neordonată

Direct3D 11 introduce un nou tip de shader, Compute Shader. Shaderul de calcul este numit ca o matrice obișnuită de fire. Fluxurile sunt împărțite în grupuri. Fiecare grup are 32 KB de memorie partajată între firele din grup. Astfel, firele din grup pot împărtăși rezultate, îmbunătățindu-și performanța. De asemenea, firele de execuție pot efectua citiri și scrieri cu acces aleatoriu la resursele grafice: texturi, tablouri de vârfuri, ținte de randare. Aceste accesări la memorie sunt neordonate, deși diferite instrucțiuni sunt sincronizate atunci când este necesar.

Shaderele de pixeli (fragment) pot citi și la o adresă arbitrară, ceea ce permite să fie scrise structuri de date care pot fi apoi utilizate într-un shader de calcul sau invers. Este demn de remarcat faptul că pixel shaders au avut întotdeauna acces aleatoriu la citire prin căutări de texturi.

Compute shaders pot efectua, de asemenea, operațiuni precum tabele cu suprafețe însumate, transformări rapide Fourier mult mai rapid decât metodele utilizate anterior pe GPU. În acest moment, Microsoft investighează biblioteci care oferă astfel de calcule. Microsoft crede că algoritmi precum randarea A-buffer și ray tracing pot fi implementați eficient, dar în acest moment nu există dovezi reale ale eficienței lor.

Apelarea unui shader de calcul înlocuiește toate etapele conductei de randare. Cu toate acestea, este posibil să amestecați shaders de calcul și randarea tradițională folosind rezultatele acestora. De exemplu, procesarea imaginii după randare de către un shader de calcul (puteți încărca structuri de date suplimentare).

Redare cu mai multe fire

D3D10 permite doar transmiterea comenzilor de randare dintr-un singur fir (în prezent există un mod special cu mai multe fire, dar din cauza performanței slabe, Microsoft nu recomandă utilizarea acestuia). După cum știți, trimiterea comenzilor de vizualizare prin Direct3D implică utilizarea resurselor de calcul suplimentare ale procesorului . Având în vedere tendința de creștere a numărului de nuclee CPU, este introdus suport pentru multithreading mai avansat pentru a distribui această muncă între mai multe fire de execuție, producând-o astfel mai eficient.

Direct3D 11 face posibilă crearea de liste de afișare din mai multe fire și executarea lor din firul principal de randare. În plus, dispozitivul care creează resursele a fost scos din contextul care trimite comenzi de randare. Acest lucru permite crearea asincronă a resurselor. Contextele amânate sunt folosite pentru a crea liste de afișare, iar Contextul imediat este utilizat pentru a transmite comenzi de randare către GPU , inclusiv gestionarea listelor de afișare create în contexte amânate.

Spre deosebire de alte caracteristici, redarea cu mai multe fire în Direct3D 11 este implementată programatic prin driver. Driverele D3D10 adecvate (poate chiar și D3D9) permit redarea multi-threaded mult mai eficient decât înainte. Un anumit nivel de multithreading va fi disponibil chiar și fără drivere noi, dar nu este încă clar ce restricții vor fi în acest caz.

Alte caracteristici

Suport pentru legarea dinamică a shaderelor (similar cu Cg). Acest lucru vă permite să separați scrierea și compilarea umbrelor de lumină și materiale. Legarea tardivă se face atunci când shader-ul este expus. Această abordare este o soluție la problema exploziei combinatorii în cazul diferitelor surse și materiale de lumină (aceasta și alte probleme sunt discutate în secțiunea 7.9 din Redarea în timp real, ediția a treia )

Au fost adăugate două noi formate de texturi comprimate. BC6 acceptă o gamă dinamică largă de texturi RGB folosind 1 octet per texel (în loc de 6 octeți pentru texturi reale RGB pe 6 biți). BC7 acceptă texturi RGB sau RGBA în gamă dinamică îngustă. De asemenea, folosește 1 octet per texel (cum ar fi DXT5/BC3), dar oferă o calitate semnificativ mai bună decât formatele de textură D3D10. Ambele formate noi folosesc mai multe tipuri de blocuri - utilitarul de compresie alege tipul de bloc adecvat pe baza conținutului său.

Formatele blocurilor de compresie D3D9 și D3D10 se bazează pe ideea că fiecare bloc 4×4 de texeli conține toate valorile sale într-o singură linie, iar biții fiecărui texel codifică o poziție în acea linie. De exemplu, în DXT1/BC1, o linie în spațiul RGB reprezintă două puncte finale RGB și fiecare texel folosește doi biți pentru a indica ce culoare este folosită din cele patru puncte de-a lungul liniei.

Noile formate D3D11 acceptă tipuri de bloc cu una, două și chiar trei linii de culoare (în cazul BC7). Există un compromis între numărul de linii și numărul de puncte de-a lungul unei astfel de linii, deoarece fiecare bloc ocupă aceeași cantitate de memorie. Practic, un bloc 4×4 cu două linii de culoare necesită încă 16 biți pe bloc pentru a specifica ce linie din fiecare texel i-a fost asociată (în cazul a trei linii de culoare, ar fi necesari și mai mulți biți). Pentru a reduce cerințele de memorie, sunt acceptate doar un set mic de modele posibile de linii de culoare. Pentru fiecare bloc, utilitarul de ambalare selectează cea mai bună opțiune din acel subset.

Direct3D 11 are o specificație mai strictă a texturii. Rezultatele decompresiei trebuie să fie precise, iar filtrarea subtexel/submip trebuie să aibă o precizie de cel puțin 8 biți.

Direct3D 11 vă permite să utilizați texturi care au o dimensiune maximă în intervalul 8K-16K texeli. Rețineți că o textură DXT1/BC1 de 16K x 16K este de 128MB - nu multe jocuri vor folosi texturi atât de mari, dar ar putea fi potrivită pentru tehnici precum megatextura . În general, o resursă poate avea acum o dimensiune de până la 2 GB în D3D11.

Hardware-ul poate suporta opțional numere reale cu virgulă mobilă cu precizie dublă.

Gamefest 2008 a prezentat și un slide cu multe alte funcții noi, ale căror detalii nu au fost explicate:

DirectX 11 și cod gestionat

SlimDX și SharpDX acceptă DirectX 11. XNA  - nr

Motoare de jocuri cu suport DirectX 11

Vezi și


Note

  1. Andrew Burnes. DirectX 11 a fost lansat pentru Windows Vista  . Voodoo Extreme 3D (28 octombrie 2009). Consultat la 29 octombrie 2009. Arhivat din original pe 17 martie 2012.
  2. Battlefield Bad Company 2 cu suport DirectX 11 . GameTech (16 aprilie 2009). Consultat la 1 noiembrie 2009. Arhivat din original pe 17 martie 2012.

Link -uri