Steps3d - Tutoriale - înregistrări exacte microreliefuri folosind paralaxa și de relief de cartografiere și
O trăsătură caracteristică a dezvoltării 3D-graphics este un grad sporit de detaliu a obiectelor. Primul pas în detaliu astfel a fost bumpmapping s utilizare (oferit primul Pancakes).
Acum a devenit o utilizare bumpmapping omniprezent. și anume per pixel de referință vector normal pentru modelarea unei rugozitate a suprafeței (microrelief acesteia). Ca urmare, este posibil să nu complica obiectele de geometrie pentru a crea iluzia mikrorelfa, și anume un grad ridicat de detaliu.
Figura 1. Exemplu de bumpmapping s.
Cu toate acestea bumpmapping dă rezultate în mod clar vizibile sau pentru a evidenția un număr mic de surse de lumină (în acest caz, este de dorit ca suprafața a exprimat puternic atât în componenta speculară DOOM 3) sau în reflexie (EMBM).
Cazul unui obiect luminat de lumină ambientală (de exemplu, obiect sub aer liber într-o zi noroasă) -lea bumpmapping convenționale, în general, nu sunt procesate.
Cu toate acestea, există alte simptome la suprafață microrelief - modificarea coordonatelor texturii de puncte în funcție de direcția observatorului și auto-shadowing etc.
În acest articol ne vom uita la modelarea unor astfel de fenomene, începând cu cele mai simple și terminând cu cele mai avansate tehnici.
Cel mai simplu mod de a seta microrelieful suprafeței de așa-numita hartă elevație (hartă înălțime) h (s, t). Există două interpretări posibile ale acestei versiuni a cardului. Valorile poate fi considerată fie ca înălțimea unui punct situat deasupra marginii (Figura 2a), sau ca o cavitate în interiorul feței (Figura 2b). Vom continua să urmeze prima interpretare.
Figura 2. posibila interpretare a hărții înălțime.
Cartografierea Parallax
Cel mai simplu caz de simulare topografie (nu de numărare bumpmapping s) este un așa-numit paralaxa (relief) de cartografiere - o metodă simplă de corectare a texturii coordonate folosind harta înălțimii.
Când (hartă înălțimea dată de h (s, t)) suprafața aspră văzută din direcția v. că, dacă nu luăm în considerare suprafața microrelief, punctul A (mai precis, punctul corespunzător al coordonatelor texturii) vor fi luate ca punct de pe ea. Cu toate acestea, intersecția exactă a fasciculului de observator corespunde punctului B (și punctul T * corespunzătoare în coordonate de textură).
Fig. 3. Punctul de calcul aproximativ pe suprafață.
Un fenomen similar - adică, schimba coordonatele texturii, în funcție de direcția observatorului datorită suprafeței topografice și se numește mapare paralaxă. Vă rugăm să rețineți că toate calculele sunt făcute în acostament spațiu tangentă (spațiu tangenta), este important ca spațiul tangentă a fost stabilită în mod corespunzător pentru fiecare față.
Este posibil să se utilizeze valoarea înălțimii de la punctul A pentru a obține valori mai exacte ale coordonatelor texturii (T1):
În această formulă, v este notat cu o tangentă vector unitate observatorului într-un sistem de coordonate, adică, vxy - este componenta tangentă și VZ - normală. H reprezintă înălțimea valorii cardului la punctul T0.
Corectarea coordonatele texturii cu formula de mai sus poate fi destul de ușor să pună în aplicare cu ajutorul simplu vertex și fragmente shaderele.
Figura 4: Imagine obținută folosind shader de mai sus (din stânga - paralaxa este activat, dreapta - nici unul).
Totuși, această metodă de corectare a coordonatelor texturii este doar aproximative, în special atunci când vectorul v aproape atinge suprafața (adică, vz
Figura 5. Papalaxă cu decalaj de limitare.
Cu toate acestea de cartografiere paralaxă discutat mai sus oferă doar o valoare aproximativă pentru suprafețe Godyaev fără modificări ascuțite în altitudine, altfel el poate da valori eronate. Astfel, în Fig. 3 în loc de valoarea exactă a T *. care corespunde intersecției fasciculului cu suprafața, vom lua valoarea T1 (deși este mai bine decât T0 valoarea inițială).
Steep Mapping Parallex
Un mod foarte simplu de a îmbunătăți acuratețea cartografiere paralaxei clasic „s este o gamă de valori înălțime perete despărțitor în mai multe segmente egale (straturi). Apoi este posibil prin straturi enumerare simple (începând cu cel mai îndepărtat, adică corespunzând cea mai mare valoare a înălțimii, stratul) pentru a găsi o valoare aproximativa a punctului de pe suprafața (Figura 6). - o abordare numită de obicei de cartografiere paralaxă abrupte.
Figura 6. Găsirea intersecției prin căutarea straturi.
În acest caz, verificați mai întâi punctul A0. apoi A1. apoi A2 și așa mai departe până la punctul următor se află sub valoarea înălțimii corespunzătoare (pentru fig. 6 este un A3 punct). De fapt, efectuat volume urmelor, rupte în straturi de grosime egală.
Acest algoritm este ușor de pus în aplicare după cum urmează pe GLSL fragment de shader. Parametru scara. ca și în trecut, controlează „gradul de relief“ - ceea ce este, selnee ciudat „bastoane“ de relief.
Cu toate acestea, deoarece nu toate acceleratoare grafice menținute în timp ce bucla în shader fragment, următoarele este o opțiune pentru un shader pentru un anumit număr de straturi în ciclu dislocat activ condiționale lanț.
Figura 7. Imaginile obținute la slop busting set de straturi.
Următoarea figură este o imagine construită folosind această abordare. Cu toate acestea, utilizarea unui număr mic de straturi pentru a scana pot produce erori vizibile, în mod clar vizibile în figură.
Figura 8. Artefactele care apar atunci când iterarea straturi.
Această relație de eroare fel faptul că testul se efectuează la intersecția vysego fasciculului doar un număr mic de straturi corespunzând unei înălțimi set discrete. În acest Isla la schimbări ascuțite ale înălțimii și / sau direcția privirii, aproape de tangenta, acest „stratificarea“, suprafața devine clar vizibilă.
Una dintre cele mai simple moduri de a face cu acest lucru este de a schimba numărul de straturi, în funcție de unghiul dintre direcția de vizualizare și normala la suprafață - unghiul mai mic (adică, cosinusul unghiului este mai aproape de unitate), mai puțin straturi decât un unghi mai mare (cosinus mai aproape la zero) - mai multe straturi. Cea mai simplă opțiune - o interpolare liniară între minimum zadanannym predeterminate și numărul maxim de straturi de cosinusul unghiului.
De asemenea, la gamedev.ru forumul a propus să utilizeze o exponențială în loc de interpolare liniară.
Relief de cartografiere
În plus față de eliminarea acestor erori pot fi găsite prin încercarea de a utiliza straturi ca punct de plecare și de a face un punct de intersecție actualizare aproximare folosind metoda de împărțire în două.
Figura 9: Punct Clarificarea folosind metoda de împărțire în două.
Deci, pentru cazul fig. 8 intersecția exactă a valorii se află între A * și A1. cu toate acestea, în aproximare inițială putem lua punctul B1 = (A1 + A *) / 2. Dacă acest punct este deasupra suprafeței definită de hartă înălțime, rădăcina este pe intervalul [B1. A *]. în caz contrar, rădăcina este pe [A1, B1].
Mai mult, în segmentul dobândit încă o dată pentru a alege valoarea de mijloc și se compară cu valoarea înălțimii. Această comparație determină care ar trebui lăsată jumătate din segmentul (deoarece conține rădăcină).
Deoarece mai multe iteratii efectuate clarificarea rădăcinii, în care în fiecare precizie iterație este dublată (deoarece lungimea segmentului care conține rădăcina este înjumătățită la fiecare iterație). După un număr fix de iterații de la mijlocul ultimului segment este luat ca rădăcină. Această abordare este numită cartografiere de relief. Mai jos este programul fragmentul corespunzător.
Ca o ilustrare a acestei abordări vom lua textura de NVSDK, definind atât harta normală (în partea RGB) și o hartă înălțime (în canalul alfa). Apoi, a construi o imagine cub pe fiecare parte, care este suprapusă o textură de piatră și hărți normale (elevație). În construcția imaginii se va folosi nu numai maparea de relief. dar, de asemenea, pentru a efectua calculul difuze per pixel și iluminare speculară.
Următoarele două imagini sunt prezentate unei imagini de cub folosind cartografiere de relief și fără (numai per pixel calcul luminanță).
Rețineți că maparea texturii pe o suprafață diferită de bumpmapping obișnuită „a.
![Steps3d - Tutoriale - înregistrări exacte microreliefuri folosind paralaxa și cartografiere de relief și (tutoriale) Steps3d - Tutoriale - înregistrări exacte microreliefuri folosind paralaxa și de relief de cartografiere și](https://webp.images-on-off.com/26/148/434x449_6rz28nhnp2gk0vdvxbd6.webp)
Fig. 10. Per-pixel iluminat folosind cartografiere de relief s
![Steps3d - Tutoriale - înregistrări exacte microreliefuri folosind paralaxa și cartografiere de relief și (steps3d) Steps3d - Tutoriale - înregistrări exacte microreliefuri folosind paralaxa și de relief de cartografiere și](https://webp.images-on-off.com/26/148/434x449_9t2qn42iwd9kb8vn5qki.webp)
Fig. 11. Per-pixel de iluminat, fără a utiliza de relief de cartografiere s
Prin modificări shader mici pot fi utilizate nu numai de cartografiere de relief pentru a determina punctul exact de pe suprafață, dar, de asemenea, pentru testarea umbrire (închiderea microreliefuri de la sursa de lumină).
Pentru a face acest lucru, caută intersecția razei cu suprafața pornește de la punctul de intersecție a găsit și transportat în direcția vectorului la sursa de lumină. Iterarea straturi, în acest caz, se realizează în sens invers (adică, creșterea corespunzătoare înălțimii).
Parallax ocluziei Mapping
Există o altă variantă de cartografiere paralaxei abrupt „, precum și, numita ocluzie cartografiere paralaxă.
Această metodă se bazează pe o observație destul de simplu - de îndată ce am primit prin încercarea de strat, în care intersecția, putem presupune doar că de-a lungul segmentului de linie, care se află în interiorul acestui strat, înălțimea variază liniar.
Figura 12. Aproximarea liniară.
Apoi, pentru determinarea aproximativă a punctului de intersecție putem găsi doar punctul de intersecție al acestei ipoteze, la toate fără binar de căutare (și în general nu se mai referă la textura). Această metodă nu este doar mai rapid, dar, de asemenea, oferind cele mai bune imagini.
Mai jos este un fragment de shader care pune în aplicare această abordare.
Următoarele capturi de ecran sunt de aplicare a acestei abordări. Observați cum chteko topografia de suprafață vizibilă.
Figura 13. Rezultatele maparea paralaxa ocluzie „și (paralaxa la stânga și la dreapta bampmepping - numai iampmepping).
Folosind distanțele hartă la suprafață
Există un alt mod interesant de a determina punctul aparent de a lua în considerare harta înălțime. Acesta este descris în capitolul 8 al cărții GPU Gems 2 (acest capitol poate fi descărcat de pe site-ul NVIDIA).
Această metodă este, de asemenea, găsirea iterativ intersecția razei de observator la suprafața obiectului. Cu toate acestea, pentru a găsi valoarea etapa următoare, se folosește o textură tri-dimensională de sprijin.
Această textură se bazează pe înălțimile hărții, în cazul în care a treia dimensiune servește înălțime. Astfel, valoarea fiecărui texel este distanța cea mai apropiată de suprafața definită de harta înălțimii (vezi fig. 15).
Figura 14. Funcția distanței la suprafață.
Figura 15. Textura dimensională auxiliară.
Această abordare este de asemenea, ca și cel anterior, poarta o cantitate infimă, dar valoarea următoarei etape de-a lungul fasciculului spre suprafața valorii acestei texturi auxiliare.
Deoarece este distanța cea mai apropiată de suprafața, ceea ce face această lungime pas, ne sunt garantate nu se intersecteze suprafața (care poate avea loc cu metoda discutată anterior).
Figura 16. aproximare succesiva la soluția exactă.
Astfel, realizarea unui număr de pași de-a lungul liniei în acest fel ne dă o valoare aproximativă a punctului de intersecție al fasciculului la suprafață. Cele mai multe măsuri vor fi efectuate, cu atât mai mare precizie.
Cu toate acestea, punctul important este dimensiunea corectă potrivire auxiliare cu valori de textură ale acestora.
Din păcate, această metodă necesită un creat special 3D-textura, și un număr de dependent (dependent) citește de textura, care este un impact destul de negativ asupra performanței.
Cone Pasul Mapping, Cone Relaxat Etapa de cartografiere
Suschesvuet o altă metodă foarte elegant, o funcție aproape de utilizat de la distanță, dar evită mereu toate 2D-tektsurami. Noi construim pe fiecare punct de maxim con larg, dar astfel încât să nu se intersectează suprafața. Apoi, fiecare astfel de con este caracterizat prin tangenta jumătate din unghiul rândul său, a pus o limită unghiul maxim - la tangenta nu mai mult de unul.
Figura 17. Conurile de pe suprafață.
Apoi, prin construirea o astfel konusya în acesta poate să nu fie puncte de pe suprafata si nu se poate verifica dacă raza se intersectează cu suprafața din interiorul conului, și du-te imediat la intersecția cu limita conului.
Prin urmare, pentru ray tracing poate fi punctul de plecare pentru a lua con și găsi intersecția fasciculului cu un fascicul conic la punctul de intersecție cu con ia nouă intersecție cu fascicul conic și căutați pentru el, iar cel de mai jos. Rezultatul este o secvență de puncte poulchaem garantate convergente la intersecția exactă a grinzii cu suprafața.
Figura 18. Construcția aproximări la punctul de intersecție.
Din păcate, metoda clasică de cartografiere pas con are o convergență destul de lent, motiv pentru care există o modificare, înmuiere restricții asupra lățimii conului - fascicul poate intersecta la suprafață, dar nu mai mult de o dată (vezi figura 19).. Astfel, fasciculul poate trece prin suprafață, dar este determinat imediat.
Figura 19. Construcția aproximări la punctul de intersecție. Roșu reprezintă versiunea clasica, verde - relaxat.
În acest caz, construit ca anterior o secvență iterativ, dar pentru fiecare punct de intersecție a grinzii și conul nu verifică dacă punctul rezultat sub suprafață. Dacă da, înseamnă că intervalul dintre punctul recepționat și secvența anterioară conține exact o intersecție, care poate fi ușor poulcheno fie prin împărțire în două sau prin interpolare liniară.
Figura 20. Găsirea intersecție.
Astfel, varianta polsedny (con relaxat etapa de cartografiere) are o rată mai mare convergență și, ca metodă de funcții de distanță, se asigură că, chiar și obiecte mici sunt sărite (care pot apărea la verificarea straturilor individuale). Următoarea figură ilustrează modul în care grinda stocată și con.
Figura 21. Găsirea intersecția fasciculului și conul.
Astfel, pentru aplicarea acestei metode necesită ajustare avans construct dimensional harta tektsuru care conține tangentele unghiurilor jumătate de con de rotație. Următorul fragment de cod pseudo ilustrează algoritmul care poate fi utilizată pentru a construi o textură.
La acest link puteți descărca toate codul sursă pentru acest articol. De asemenea, disponibil pentru descărcare versiuni binare pentru M $ Windows. Linux și Mac OS X.