Tanulságok OpenGL ogldev site - 25. lecke

Skybox - ez a módszer növeli a vizuális jelenet, ami még inkább kifejező létrehozásával textúrát körül a nézőt, amely körülveszi a kamera 360 fokban. A textúra gyakran kombinációja ég és a terep, mint a hegyek, felhőkarcolók, és így tovább. Bár a környék felfedezéséhez játékos, ő fogja látni egy részét a Skybox, amely kitölti az üres pixelek nem terjed ki a hagyományos modellek. Íme egy példa a Skybox Half-Life:

Tanulságok OpenGL ogldev site - 25. lecke

Az ötlet megjelenítésére Skybox a nagy kockát és a néző szállást központjában. Ha mozog a kamera követi őt kocka, így a néző soha nem éri el a „horizont” a jelenet. Ez hasonló a valós világban, ahol látjuk, hogy a felhő „touch” a föld a láthatáron, de ahogy haladunk előre, a horizont marad az azonos távolságra (attól függően, terep).

Egy különleges fajta textúrák jelenik meg a kocka. Ez a textúra jön létre oly módon, hogy ha megfelelően vágott és hajtogatott, majd annak határain egybeesnek rajz egymással, és valaki, aki benne van az értelemben, hogy a textúra a szereposztás. Például itt ez a textúra:

Tanulságok OpenGL ogldev site - 25. lecke

Ha kivágjuk a fehér területek felett a textúra és adjuk hozzá a többi része, a fehér vonalak, akkor kap egy kockát, amely megfelel a követelményeknek. Az OpenGL ezek a textúrák egy különleges nevet köbös szerkezetű (Cubemap).

Annak érdekében, hogy a minta a kocka textúra, használjuk a 3D textúra koordináták helyett 2D, amiről már oly régóta használ. Minta textúra fogja használni ezeket a koordinátákat a vektor és az első ellenőrzést, amely a fél 6 tartalmazza a texel, majd húzza ki ez az arc. A folyamat lehet látható a következő képen (lenézett a doboz):

Tanulságok OpenGL ogldev site - 25. lecke

A kiválasztás alapján a legmagasabb oldalán koordináta értékét a textúra. A fenti példában azt látjuk, hogy a Z a legnagyobb érték (nem látjuk az Y, de feltételezzük, hogy ez kevesebb, mint a Z). Mivel Z egy pozitív jel, akkor kell használni a vonalat, ahol a textúra van megjelölve PosZ ", és texel veszik ki belőle (a másik oldalon - ez NegZ„”PosX„”NegX„”jelige»és a«Négy „).

Skybox módszer is bemutatott egy gömb helyett egy kocka. Az egyetlen különbség az, hogy a hossza a vektor minden lehetséges irányban azonos (mint ez a gömb sugarának), míg a kocka különböző hosszúságú. Texel kiválasztási mechanizmus nem változott. Skybox, amely ahelyett, hogy a kocka - gömb hívják Skydome. Ez az, amit fel fogjuk használni a demo a leckét. Meg kell próbálnia, mindkét lehetőséget, és válassza ki a legmegfelelőbb.

Ez az osztály tartalmazza a végrehajtás egy köbös szerkezetű és egyszerű felületet biztosít annak letölthető és használható. A kivitelező veszi a könyvtár és 6 fájlneveket tartalmazó oldalán a kocka. Az egyszerűség kedvéért feltesszük, hogy minden fájl ugyanabban a könyvtárban. Az elején meg kell egyszer hívja a Load () függvény, amely letölthető az összes kép, és hozzon létre a tárgy textúra OpenGL. Osztály tulajdonságok nevei képfájlok (jelenleg írva a teljes elérési út), és egy mutatót az objektum textúra OpenGL. Ez az egyetlen mutató hozzáférést biztosít az összes 6 arcok a kocka textúra. Végrehajtása során fel kell hívni Bind () a megfelelő modul a textúra, hogy lenne egy minta áll rendelkezésre a shader.

A funkció, amely betölti a textúra létrehozásával kezdődik az objektum textúra. Ez az objektum van rendelve egy speciális címkét GL_TEXTURE_CUBE_MAP. Aztán kap egy hurkot tartalmazó felsorolás GL, mely része a harmadfokú textúra (GL_TEXTURE_CUBE_MAP_POSITIVE_X, GL_TEXTURE_CUBE_MAP_NEGATIVE_X stb.) Ez a felsorolás megegyezik a sorvektor „m_fileNames”, amely egyszerűsíti a ciklus. Képfeltöltés fájlokat egyesével majd át ImageMagicknek jelzett OpenGL keresztül glTexImage2D (). Vegye figyelembe, hogy minden hívás a funkcióhoz révén hajtják végre a megfelelő GL enum erre oldalán (ez mennyivel tömbök „típusú” és a „m_fileNames” azonosnak kell lennie). Miután egy kocka textúra van töltve, és tele, mi meg néhány zászlókat. Már meg kell ismernie őket, kivéve GL_TEXTURE_WRAP_R. Ez a felsorolás csak használatát jelenti a 3-dimenziós textúra koordinátákat. Mindegyikük azt is hozzá tömörítési módot.

Ezt a funkciót kell meghívni, mielőtt használjuk a textúra, hogy felhívja a Skybox. A textúra is csatolni kell a GL_TEXTURE_CUBE_MAP, már használják ezt az értéket a Load () függvényt.

Hogy elvegye a Skybox fogja használni a saját módszerét. Ez egy sor tulajdonságot, hogy van, hogy jelezze a kihívásokra - WVP mátrix átalakítására egy kocka vagy egy gömb és a textúra, hogy alkalmazni fogják. Vessünk egy pillantást az osztályon belül.

Ez vertex shader a Skybox. Elég egyszerű, de meg kell figyelni, hogy néhány trükköt. Az első trükk, hogy átalakítsa a bemeneti vektor pozíciókat a szokásos módon a mátrixon WVP, de aztán a vektorban, amely át, hogy a töredék shader, cseréljük a Z koordináta W. után a végén vertex shader raszterizáló kap gl_Position vektorba és a vektor generál kilátások Division (osztás W) annak érdekében, hogy megállapítható legyen a vetítés. Amikor beállítjuk a Z W, és biztosítjuk, hogy a végső helyzetben Z értéke egyenlő lesz a 1.0. Ez azt jelenti, hogy a Skybox mindig veszít a mélység vizsgálat másik modell a jelenetet. Tehát Skybox mindig a hátteret, hogy mindent, ami a színpadon, hogy pontosan mit akarunk.

A második trükk az, hogy használjuk a kezdeti pozíciót a helyi, mint a 3D-s textúra koordinátákat. Úgy működik, mert az a tény, hogy a kiválasztott mintát egy köbös szerkezetű néz ki, mint egy vektor a központtól, hogy egy pontot a kocka vagy gömb. Ezért a pont pozícióját válik a textúra koordinátákat. Vertex shader továbbítja a helyi koordinátákat minden csúcsa a textúra koordinátákat (8 csúcsa egy kocka, és sokkal több a gömb), akkor lesznek interpolált minden egyes képpont raszterez. Ez ad nekünk egy pixel pozíció, amit lehet használni a mintavételre.

Töredék shader végtelenül egyszerű. Minden, amit teszünk, a „samplerCube” helyett „sampler2D” elérni a kocka textúra.

Skybox osztály tartalmazza különböző elemek - a módszer, a köbös szerkezetű és a modell egy gömb vagy kocka. Egyszerűsítése annak használatát, ez az osztály tartalmazza az összes elemet, amely szükséges annak helyes használata, önmagán belül. Egyszer inicializált elején a rendező és a nevét a harmadfokú textúra fájlt, majd használjuk a futás a Render () függvényt. Az egyetlen függvényhívás gondoskodik mindenről. Megjegyzendő, hogy amellett, hogy a komponensek említett ugyanabban az osztályban van hozzáférése a kamera és az értékeket a perspektivikus vetítés (FOV, Z és a képernyő felbontás). Szükséges, hogy a helyes megtöltését a szállítószalag például osztály Pipeline.

Az első dolog, amit meg fog változni az, hogy csökken a rendszer. Általában mi elutasítjuk a felület, ami ellentétes irányban a kamra, és ebben az esetben a kamera van a dobozban, ezért szeretnénk látni őket előtte, sem hátra. A probléma az, hogy a területén az általános modell, amely az itt használt jelentése az irányt a háromszögek, míg a belső része szükséges (attól függően, hogy a sorrendben a csúcsok megadva). Tudjuk vagy módosíthatja a modell vagy irányának megfordításához eldobás módját. Mi inkább az utóbbi lehetőség, tehát ugyanaz a gömb modell lehet más helyzetekben. Ezért azt mondjuk OpenGL megválni az első a háromszögek.

A következő dolog, ami ezt a funkciót - ez a számítás WVP mátrixban. Megjegyezzük, hogy a globális Skybox helyzetben van beállítva, hogy a kamera. Ez fogja a fényképezőgépet stabilan központjában annak bármely helyzetben. Miután csatlakozik a kocka textúra egység 0 (ez a modul már be van állítva, amikor létrehozza SkyboxTechnique a Skybox :: init ()). Akkor válik mesh szférában. Végül az eredeti értékek iránt szemetet és mélysége teszt.

Hasznos fedélzeti teljesítmény mindig teszi a Skybox legalább (miután az összes többi modell). Ennek oka az, hogy tudjuk, hogy mindig a másik mögött tárgyak a helyszínen. Egyes GPU (grafikus feldolgozó egység) van egy mechanizmus optimalizálás, ami abból áll, hogy a töredék shader nem nevezhető, ha a pixel elveszíti mélység teszt. Ez nagyon hasznos, azokban az esetekben, Skybox a fragment shader meghívásakor csak a többi a háttérben képpont, amely nem terjed ki más modellek. De ehhez szükség van egy mélységi puffer tele van, megkapjuk a feldolgozás után a többi modell.