Lecții de pe site-ul ogldev cu OpenGL - Lectia 25
Skybox - o metodă care crește vizual scena, făcându-l mai expresiv prin crearea unei texturi în jurul privitorului, care înconjoară camera 360 de grade. Textura este adesea o combinație de cer și de teren, cum ar fi munți, zgârie-nori și așa mai departe. În timp ce explorarea player-ul zonei înconjurătoare, el va vedea o parte a SkyBox, care umple pixelii goale nu sunt acoperite de modelele convenționale. Aici este un exemplu de SkyBox Half-Life:
Ideea de redare un Skybox în mare cub și spectator cazare în centru. Când mutați camera urmează cub ei, astfel încât privitorul nu se va ajunge la „orizontul“ al scenei. Acest lucru este similar cu lumea reală, în cazul în care vom vedea cum nor „atinge“ de teren la orizont, dar așa cum am merge mai departe, orizontul rămâne la aceeași distanță (în funcție de teren).
Un tip special de texturi afișate pe un cub. Aceasta textura este creat în așa fel încât în cazul în care este tăiat și pliat în mod corespunzător, atunci granițele sale coincid pe desen unele cu altele, și pentru cineva care este într-un sens că textura exprimate. De exemplu, aici textura:
Dacă ne-am tăiat zonele albe de mai sus textura și se adaugă partea rămasă de-a lungul liniilor albe, vom obține un cub care îndeplinește cerințele noastre. În OpenGL în aceste texturi au o textură cubică nume special (Cubemap).
Pentru a lua o mostră de textura cub, vom folosi coordonate o textură 3D în loc de 2D, pe care le-am atât de mult timp folosind. Proba textura va folosi aceste coordonate ca vector și primul control care a laturilor 6 cuprinde Texel și apoi scoateți-l din această față. Procesul poate fi vizibil în imaginea următoare (privind în jos pe caseta):
Selecția se bazează pe cea mai mare parte a valorii de coordonate a texturii. In exemplul de mai sus, vedem că Z are cea mai mare valoare (nu putem vedea Y, dar presupunem că este mai mică decât Z). Deoarece Z este un semn pozitiv, acesta va fi folosit linia, în care textura este marcat ca fiind Posz „și texel va fi scos din ea (cealaltă parte - este“ NegZ „“ PosX „“ NegX „“ posy «și» negy „).
Metoda Skybox poate fi prezentată printr-o sferă în loc de un cub. Singura diferență este că lungimea vectorului în toate direcțiile posibile este același (deoarece este raza sferei), în timp ce cub are o lungime diferita. mecanism de selecție Texel nu sa schimbat. Skybox, în care, în loc de cubului - sferă se numește SkyDome. Asta vom folosi în demo pentru lecție. Ar trebui să încercați ambele opțiuni și să aleagă cele mai potrivite.
Această clasă include punerea în aplicare a unei textură cubică și oferă o interfață simplă pentru download și utilizarea acestuia. Constructorul ia un director și 6 nume de fișiere care conțin părțile laterale ale cubului. Pentru comoditate, presupunem că toate fișierele sunt în același director. La început avem nevoie pentru a apela o dată funcția de încărcare (), care ar descărca toate imaginile și de a crea OpenGL obiect textura. Proprietățile de clasă sunt numele fișierelor de imagine (scrise în prezent cu calea completă) și un pointer la OpenGL obiect textura. Acest singur indicator oferă acces la toate cele 6 fețe ale texturii cub. În timpul executării ar trebui să fie numit bind () cu modulul corespunzător pentru textura care ar face un model disponibil pentru shader.
O funcție care încarcă textura începe cu generarea texturii obiectului. Acest obiect este atribuit unui GL_TEXTURE_CUBE_MAP special tag-ul. Apoi vom intra într-o buclă care conține GL enumerare, care este parte a texturii cubice (GL_TEXTURE_CUBE_MAP_POSITIVE_X, GL_TEXTURE_CUBE_MAP_NEGATIVE_X etc). Această listă este aceeași ca vector rând „m_fileNames“, care simplifică ciclul. încărcarea fișierelor de imagine, unul câte unul și apoi prin ImageMagick indicat în OpenGL prin glTexImage2D (). Rețineți că fiecare apel la această funcție se realizează prin intermediul enum GL adecvat pentru această parte (care este modul în care trebuie să fie mult mai „tipuri de matrici“ și „m_fileNames“ la fel). După o textură cub este încărcat și umplut, am stabilit niște steaguri. Ar trebui să fie deja familiarizați cu ele toate, cu excepția GL_TEXTURE_WRAP_R. Această listare înseamnă pur și simplu utilizarea coordonatelor texturii 3-dimensionale. Pentru toate acestea am adăugat, de asemenea, modul de compresie.
Această funcție trebuie să fie numit înainte de a folosi o textură pentru a desena SkyBox. Textura va fi atașat la GL_TEXTURE_CUBE_MAP, am folosit această valoare în funcția Load ().
Pentru a reda SkyBox va folosi propria sa metodă. Ea are un set de proprietăți pe care trebuie să indice prin provocări - WVP matrice pentru transformarea unui cub sau a unei sfere și textura care vor fi aplicate. Să aruncăm o privire în interiorul clasei.
Acest vertex shader pentru SkyBox. Este destul de simplu, dar trebuie să acorde o atenție la unele trucuri. Primul truc pe care le transforma pozițiile vectoriale de intrare ca de obicei prin intermediul WVP matrice, dar apoi în vectorul, care este transferat la shaderului fragmentului, înlocuim la Z coordonate W. După final vertex shader rasterizerul primește vectorul gl_Position și vectorul genera diviziune perspective (divizare prin W) pentru a concluziona că proiecția. Când am stabilit Z în W, și să ne asigurăm că valoarea finală poziția Z va fi egală cu 1,0. Acest lucru înseamnă că SkyBox va pierde întotdeauna alte modele de test de adâncime ale scenei. Deci, Skybox va fi întotdeauna fundalul la tot ceea ce este pe scena, asta este exact ceea ce ne-am dorit.
Al doilea truc este că folosim pozițiile inițiale în zona locală, ca coordonate de textură 3D. Acesta funcționează din cauza faptului că alegerea eșantionului într-o textură cubică arată ca un vector de la centru la un punct de pe cubul sau sfera. Prin urmare, poziția punctului devine coordonatele texturii. Vertex Shader transmite coordonatele locale ale fiecărui nod ca coordonatele texturii (8 vârfuri ale unui cub și mult mai mult pentru sfera), atunci ei vor fi interpolate pentru fiecare pixel rasterizare. Acest lucru ne va oferi o poziție de pixel, pe care o putem folosi pentru prelevarea de probe.
Fragment shader infinit de simplu. Tot ceea ce facem este sa folositi „samplerCube“ în loc de „sampler2D“ pentru a avea acces la textura cub.
Clasa de Skybox include mai multe elemente diferite - metoda, textura cubică și modelul unei sfere sau a unui cub. Pentru a simplifica utilizarea acestuia, această clasă include toate elementele care sunt necesare pentru utilizarea corectă a acestuia, în el însuși. odată ce El inițializată la început cu directorul și numele fișierului texturii cubice și apoi folosit în timpul rulării prin funcția render (). Singura funcției de apel are grijă de tot. Rețineți că, în plus față de componentele menționate în aceeași clasă are acces la camera și valorile pentru proiecția în perspectivă (FOV, Z și rezoluția ecranului). Este necesar pentru umplerea corectă a conductei transportoare exemplu de clasă.
Primul lucru pe care îl va schimba este să renunțe la regimul. De obicei, respingem de suprafață, care este opusă direcției de cameră, iar în acest caz, aparatul de fotografiat este în interiorul cutiei, astfel încât dorim să le vedem în față, nu în spatele. Problema este că în sfera modelului general, care este folosit aici, este direcția triunghiuri, în timp ce interiorul este necesar (în funcție de ordinea nodurilor specificate). Putem schimba fie modelul sau inversa direcția de modul în scădere. Noi preferăm ultima opțiune, astfel încât același model sferă poate fi utilizat și în alte situații. Prin urmare, ne spune OpenGL să se debaraseze partea din față a triunghiuri.
Următorul lucru care face ca această caracteristică - această matrice WVP de calcul. Rețineți că poziția globală Skybox este setat la aparatul de fotografiat. Acest lucru va ține aparatul nemișcat în centrul în oricare dintre pozițiile sale. Odată atașat la unitatea cub textura 0 (acest modul a fost deja configurat la crearea SkyboxTechnique în SkyBox :: Init ()). Apoi, redat sfera plasă. În cele din urmă, valorile originale sunt returnate gunoi și adâncimea de testare.
Util pentru performanța de bord va face întotdeauna SkyBox cel puțin (după toate celelalte modele). Motivul este că noi știm că el va fi întotdeauna în spatele celorlalte obiecte din scena. Unele unități de procesare grafică (unități de procesare grafică) au un mecanism de optimizare, care constă în faptul că fragmentul shader nu va fi numit în cazul în care un pixel pierde test de adâncime. Acest lucru este foarte util în situații cu Skybox ca shader fragmentul este invocat numai pentru restul de pixeli de fundal, care nu sunt acoperite de alte modele. Dar acest lucru necesită un tampon de profunzime este umplut, vom obține după randare alte modele.