managementul shader de suprafață utilizând tessellation DX11 - Unitate

Shadere de suprafață au unele DirectX mozaicării GPU 11. Ideea este după cum urmează:

  • Tessellation este determinat modificator forma un mozaic: functionName. Această funcție calculează factorii mozaicării la frontieră și în interiorul triunghiului.
  • Când se folosește un tessellation, după ce se numește „vertex modificator“ (nod: functionName) generat pentru fiecare vertex shader în domeniu. Aici ar fi în mod normal, a făcut impunerea de hărți de dizlocare.
  • shader de suprafață Opțional poate produce calcul Phong tessellation pentru netezirea suprafeței modelului, chiar și fără impunerea de hărți de dizlocare.

Limitări curente sprijină tessellation:

  • Numai un domeniu triunghiular - fără nici quad-uri izolinii mozaicării.
  • Când se utilizează tessellation, Shader compilat automat folosind Shader Model 5.0, astfel că va funcționa numai sub DX11.

Nu tessellation GPU, vârfuri modificator de deplasare

Să începem cu shader de suprafață, ceea ce face ca impunerea de hărți de dizlocare fără tessellation. El se mișcă doar nodurile de-a lungul normalele lor, pe baza valorilor citite dintr-o hartă de deplasare:

Shader de mai sus este destul de standard, locuri interesante:

  • Vertex modificator disp face selecția de schimburi harta și mută nodurile de-a lungul normalelor lor.
  • Structura de utilizator folosit „introducere de date vertex“ (AppData) în loc de implicit structurilor appdata_full. Deși nu este necesar, dar pentru tessellation reduce în mod eficient utilizarea structurii.
  • Deoarece nostru nod coordonatele nu au o 2-a coordonate UV, vom adăuga nolightmap directivă pentru a exclude hărți de acoperire.

Iată câteva obiecte simple, vor apărea atunci când utilizați acest Shader:

managementul shader de suprafață utilizând tessellation DX11 - Unitate

O cantitate fixă ​​de tessellation

Să adăugați o sumă fixă ​​de tessellation, și anume același nivel de tessellation pentru întreaga rețea. Această abordare este utilă în cazul în care poligoanele de pe ecranul modelului dvs. de aceeași mărime. Apoi, un cod ar putea schimba nivelul de tessellation bazat pe distanța de la cameră.

Caracteristică tessellation tessFixed în Shader noastre returnează patru factor tessellation sub forma unei singure float4 valoare: trei factori pentru fiecare latură a triunghiului, și un factor pentru zona internă a triunghiului. Aici, ne întoarcem la doar o valoare constantă, care este specificată în proprietățile materialului.

managementul shader de suprafață utilizând tessellation DX11 - Unitate

Tessellation bazat pe distanța

Putem schimba, de asemenea, nivelul de tessellation, în funcție de distanța de la cameră. De exemplu, am putea declara două valori la distanță; distanța la care tessellation maximă (să zicem 10 metri) si distanta, mai aproape de care nivelul tessellation scade treptat (să zicem 20 de metri).

Aici funcția tessellation are trei parametri; date vârful trei unghiuri ale unui triunghi la tessellation. Este necesar să se calculeze nivelurile de teselarea, care depind de poziția curentă a nodului. Vom include o funcție de UnityDistanceBasedTess încorporat în fișierul auxiliar Tessellation.cginc și de apel de la el pentru a efectua lucrările. Această funcție calculează distanța până la fiecare cameră de nod și preia factorii mozaicării finale.

managementul shader de suprafață utilizând tessellation DX11 - Unitate

pe bază de lungime laterală Teselare

Tessellation se bazează numai pe distanța de bun numai atunci când dimensiunea triunghiului sunt destul de asemănătoare. Pe imaginea afișată mai sus, este posibil să observați că obiectele cu mici tessellation triunghiuri prea puternic, în timp ce obiectele cu un triunghi mare tessellated suficient.

In schimb, nivelurile mozaicării poate fi calculată în funcție de lungimea laturilor unui triunghi pe ecran. - latura mai lungă, cu atât mai mare ar trebui să fie aplicat factorul tessellation.

Aici, din nou, noi numim pur și simplu funcția de la UnityEdgeLengthBasedTess Tessellation.cginc pentru a efectua lucrările.

managementul shader de suprafață utilizând tessellation DX11 - Unitate

Pentru a menține o bună performanță, în loc de funcția de mai sus, se recomandă pentru a apela funcția UnityEdgeLengthBasedTessCull. ceea ce va face insule trunchierea tronconic. Acest lucru face ca shader un pic mai intensive în resurse, dar păstrează un număr mare de resurse pentru GPU părți ale rețelei, care nu intră în zona de camera de luat vederi.

Phong tessellation

Phong tessellation schimbă poziția subdivizat poligon, astfel încât suprafața rezultată este urmată ușor normalele plasei. Aceasta este o modalitate destul de eficientă pentru a netezi ochiurile-mici poli.

Surface Shaders Unitatea poate calcula automat Phong tessellation folosind tessphong directiva de compilare: nume_variabila. Iată un exemplu Shader:

Aici este o comparație între un shader normal (rândul de sus) și una care utilizează tessellation phong (rândul de jos). Este posibil să observați că, chiar și fără nici o mapare de deplasare suprapunere, suprafața devine mai rotunjite.

managementul shader de suprafață utilizând tessellation DX11 - Unitate

Exemple de acoperire de suprafață shaderele

vertex programare și fragment (pixeli) shadere