Az OpenGL - munka képekkel

5.1 Közös szavak

Építsd primitív tárgyakat már megtanult. De ahhoz, hogy építsenek egy háromdimenziós jelenetet csak primitívek akkor nem kell, és úgy néznek ki, mint valami sematikus és unalmas. Annak érdekében, hogy feltámassza őket, hogy elő primitívek kép - textúra. A háttérben a jelenet az is hasznos, hogy egy grafikus kép. Így az alkalmazás válik élénk és érdekes. Tehát ebben a fejezetben megtanuljuk, hogyan kell dolgozni a képeket.

5.2 Munka Képek

Sok képformátumok - bmp, PCX, GIF, JPEG és mások. OpenGL közvetlenül nem támogatja, nem egy közülük. Az OpenGL, nincs olvasási / írási képfájlokat funkciókat. De támogatott munka tömbök pixel. Ön feltölteni a képfájlt egy harmadik fél könyvtár, a memória és a velük dolgozó jelenti az OpenGL. A tömb adatok képpont lehet elrendezhető különböző módokon: RGB, BGR, RGBA; nem lehet jelen az összes komponenst; minden egyes eleme a tömb lehet elfoglalni egyetlen bájt, kettő, négy vagy nyolc; igazítás lehet bájt, szó vagy dupla szó. Általában grafikus ábrázolása a helyét adatformátum nagyon is szem előtt tartva. Nézem az egyiket, a leggyakrabban használt, azt hiszem. Tájékoztatás az egyes pixelek a tárolt RGB formátumban, és elfoglalja a három byte byte összehangolás. A Kiegészítő Könyvtár függvénye auxDIBImageLoad (LPCSTR), amely betölti a BMP-fájlt a memória és visszaad egy pointert a szerkezete:

Az egyszerűség kedvéért fogom használni az adott funkciót. Között a kísérő programok talál én segédprogramot letölteni a fájlokat a PCX formátum. A forráskód A segédprogram teljes mértékben hordozható bármely platformon fordító ANSI C

Mielőtt hívja auxMainLoop funkciót a fő funkciója be a következő sort:

Alignment által létrehozott egy funkció a glPixelStorei GL_UNPACK_ALIGNMENT paraméter és a második paraméter - egy egész szám, amely jelzi az összehangolás. Képek jelennek meg közvetlenül a képernyőn. Ezért minden zajlik kétdimenziós koordináta. A pozíció, ahol a kimenő képet kezdődik, jelöljük glRasterPos2d (x, y) függvény. Szintén beállítható a pixelméret hívja glPixelZoom. Az első paraméter a funkció - a szélesség, a második - a magassága a pixel. Hívom ezt a funkciót érvek (1.1), amely megfelel egy normál pixel. Cserélje (1.1) a (3.2), és látni fogja, hogy a kép is háromszorosára kinyújtva vízszintesen és függőlegesen kétszer. Ez történt, mert most minden pixel felel meg 3x2 téglalap az ablakban. Végül a kiadási függvénye glDrawPixels. Az első két paraméter - a szélesség és magasság. Ezután adja meg a formátumot, amelyben információ van tárolva a memóriában, és a típus a tömb elemeit. Az utóbbi azt jelzi, az adatok tömb. A kijelző funkció, illessze be a következő kódot:

Is kapható OpenGL glBitmap funkció megjelenítéséhez bitmap. Bitmap - bájtok sorozata kódoló egy képet a két szín. Ennek megfelelően, minden egyes bájt kódol 8 pixel. Között a kísérő programok talál én közüzemi pcx_2bpp. Olvas PCX-fájlformátum egy bit per pixel, és irányítja a standard kimenetre tömb C nyelven.

Az OpenGL - munka képekkel

A forrás fájl itt. Végrehajtható itt. Saját képet.

5.3 Feladat: „Háttér a játék Arcanoid”

Az OpenGL - munka képekkel

A forrás fájl itt. Végrehajtható itt. Csillagos ég itt.

5.4 létrehozása textúra memória

Egy kép kimenet nem elég ahhoz, hogy egy teljes körű háromdimenziós jelenetek. Gyakran szükség van előírni kép háromdimenziós objektumok és forgatni / mozgatni őket. Ezekre a célokra a jelenlegi struktúra. Továbbá, a textúra segít fedezni a teljes objektum formájában egy mozaik. Például, ha van egy téglafal, akkor nem kell letölteni a képet egy halom tégla. Csak töltse le az egyik tégla és azt jelzi, hogy ez szükséges, hogy reprodukálja a textúra az egész gépet.

Először megbeszéljük megteremtése és állományjavító a gépen. Aztán, úgy textúraleképezési a tárgyak a 4.1. És végül, az összes többi létrehozott poligon; különösen a tórusz és egy vízforraló.

Alkalmazásához textúra egy tárgyat kell tennie:

  1. Töltsön fel egy képet a memóriában
  2. Adjon meg egy nevet azonosító textúra
  3. Legyen aktív
  4. Hozza létre a színes térkép memória
  5. Állítsa be a paramétereket a textúra
  6. Állítsa be a paramétereket a kölcsönhatás a tárgy textúrák
  7. Hozzárendelése textúra koordinátákat a tárgy

Az első dolog, amit megtanultam, hogy nem az előző részben. Hozzon létre egy projektet az úgynevezett Texture. Állapítsa meg a következő globális változók:

Változók photo_tex space_tex szolgál majd azonosítóit textúrák. És photo_image space_image és mi fogja betölteni bmp-fájlokat. Itt meg kell jegyezni, hogy a OpenGL textúra legyen olyan méretű 2n x 2m, ahol n és m egész számok. Ez úgy történik, hogy gyorsítsák fel, mert nyomni vagy ki ilyen textúrát gyorsabb és kényelmesebb. Persze, akkor képet feltölteni bármilyen más méretű, de akkor azt kell méretezni. Véleményem szerint ez a baj. Az eredmény méretezés nem tudja rendezni. Szóval használja a képfájlok méretének többszöröse a hatalom kettő. Inkább a kép szerkesztéséhez bármilyen grafikai csomagot, vágja, vagy fordítva, hogy kiegészítse, mint hogy megtudja, miért torzul. Azonban sok múlik az adott esetben. A művész, aki a textúra, nem érdekel, hogy milyen méretű, hogy ezt, így könnyebb megkérni, hogy a képet a megfelelő méretet. Illessze be az alábbi kódot a fő funkciója.

Készítsen képeket a programom - Texture. Photo viheti. ;-) Csak méret kívánatos elhagyni 512x512.

Most kell, hogy hozzon létre egy nevet azonosítót textúra. Meg kell létrehozni, ha van az alkalmazás több mint egy textúra, hogy képes legyen megkülönböztetni őket valahogy. Ellenkező esetben, ha a textúra csak egy van, ő nem kell azonosítót. A következő példában, ha a textúra leképezés a gömb, mi lesz pontosan egy textúra, és megmutatom neked a kihívások, amelyek funkciója nem kötelező. Addig azt javaslom, hogy meg kell használni több textúrák. By the way, átnéztem egy csomó példát, amikor könyvet ír. Köztük volt példa a jól ismert Red Book példákat, MSDN, az internet és más forrásokból, de mindent textúrák, a munka csak egy textúra. Például a unit-programot, persze, jöjjön fel, és egy textúra, de egy komoly alkalmazás nem valószínű. Szeretnénk, hogy írjon egy komoly alkalmazás, így meg kell használni több textúrák. glGenTextures függvény bemeneti két paramétert. Az első számát mutatja textúra azonosító neveket szeretne létrehozni. A második lehetőség - egy mutatót egy sor unsigned int típusú elemek. A számát a tömb elemeinek kell egyeznie a megadott szám, mint az első paraméter. Például a következő kód létrehoz textúrák tíz neveket.

Tartsuk textúrák azonosítókat a tömb nem mindig kényelmes. Ez a módszer alkalmas a tárat háttérrel és típusú falak - tégla, kő, stb Általában a tömb tárolja az elemeket, amelyek között van valami közös. Ebben az esetben a két kép hasonló, mert használt ugyanazt az alkalmazást, ezért hoztam létre két különböző azonosítóval. Tehát hozzá a következő kódot a fő funkciója.

Most ragaszkodnak a textúra kép, azaz a Mi legyen az aktív. Erre a célra a funkció glBindTexture. Az első paraméterben GL_TEXTURE_2D vagy GL_TEXTURE_1D. Ez azt mutatja, egy egydimenziós vagy kétdimenziós képet fog működni. Minden ezek a példák is aggodalomra kétdimenziós textúrák. Egy egydimenziós struktúra, csak még nem talált egy gyönyörű példája. Azonban a Red Book egy példa egy egydimenziós struktúra. Ott Kettle festeni a piros szalagot. Amennyiben iménti példák és még sokan mások függelék „A”. A második paraméter glBindTexture - ID, amit teremtett fent, glGenTextures. Most adjunk hozzá egy hívást, hogy ezt a funkciót a fő.

Most arra van szükség, hogy megteremtse a színes térkép memóriát. byte tömböt AUX_RGBImageRec szerkezet még csak nem is azért, mert a textúra a textúra egy csomó különböző lehetőségeket. Létrehozása textúra, vagyunk felruházva sajátos tulajdonságait. Paraméterek közül a textúra megadhatja a részletesség szintjét, a módszer a méretezés és a textúra kötő egy tárggyal. A részletesség szintje szükséges textúraleképezési a kisebb tárgyak, azaz ha a képernyő terület kisebb, mint a kép méretét. A nulla szint részletességgel megfelel az eredeti képméret 2nx2m, első szintű - 2-n-1x2m-1, k-adik szint - 2-n-kx2m-k. A szintek száma megfelel perc (n, m). Létrehozásához a textúra két funkciója glTexImage [1/2] D, és gluBuild [1/2] DMipmaps.

A fő különbség az, hogy az első függvény létrehoz egy bizonyos szintű textúra részletesség és látja, csak a képet. mérete, amely többszöröse a hatalom kettő. A második funkció a rugalmasabb. Ez generálja az összes textúra részleteket szinten. Továbbá, ez a funkció nem igényli, hogy a méret a többszöröse a hatalom kettő. Elszárad / húzni a képet magát megfelelően, bár talán kiderül, hogy nem a legjobb. Veszem glTexImage2D funkciót. Az első paraméter az ezt a funkciót kell GL_TEXTURE_2D. A második - a részletesség szintjét. Szükségünk van az eredeti kép, így a részletesség szintjét - nulla. A harmadik paraméter száma színű alkatrészeket. A képek tárolása RGB formátumban. Ezért a paraméter értéke egyenlő három. A negyedik és ötödik paraméterek - szélessége és magassága a kép. Hatodik - a szélessége a határ nem lesz határokat, így ez az érték - a nulla. Ezután egy hetedik paraméter - a tárolási formátum pixelek a tömbben - GL_RGB és típusa - GL_UNSIGNED_BYTE. Végül a nyolcadik paraméter - a mutató egy tömb adatokat. Mégis meg kell hívni a funkció glPixelStorei és kérje, hogy az összehangolás az adatokat byte van kapcsolva. Adjuk hozzá a következő kódot a fő funkciója.

Hasonló eredmény érhető el beiktatásával egy hívás gluBuild2DMipmaps megadott paraméterekkel alább.

Most kell, hogy állítsa be a paramétereket a textúra. Mert ez a funkció

Az első paraméter értéket veszi fel GL_TEXTURE_1D vagy GL_TEXTURE_2D. Második - pname - határozza meg a textúra paraméter meg fog változni. És a harmadik lehetőség - egy beállított értéket. Ha használt gluBuild2DMipmaps glTexImage2D helyett, akkor nem kell telepíteni az alábbi lehetőségek közül, mint már kialakult a textúra minden szintjén részletesen és OpenGL textúra lesz képes kiválasztani a megfelelő szintre, ha a terület a tárgy nem ugyanaz, mint a terület textúra. Ellenkező esetben, meg kell hozzá a következő sorokat:

Jelezte, hogy annak érdekében, hogy csökkentsék, és növeli a textúra felhasználhatja GL_NEAREST algoritmus. Ez azt jelenti, hogy a szín az objektum pixel, melyek textúrája alkalmazzák, a szín lesz a legközelebbi pixel struktúra elem. Ehelyett megadhatja GL_NEAREST GL_LINEAR, azaz objektum elem szín átlagából számítjuk a négy textúra elemek. Négy szín algoritmust az objektum eleme. Azt lehet telepíteni, amikor beállította a textúra minden szintjén részletesen, mivel GL_NEAREST használt algoritmusok és GL_LINEAR egy vagy két legközelebbi szintű részletességgel.

Mégis, akkor meg a kölcsönhatás az objektum textúra. Két mód használatának három színes elemek. Az első mód az alapértelmezett, ha figyelembe veszi a színét a tárgy színét és állagát. A kapott szín szorzatából színösszetevő a textúra a tárgy színe komponenseket. Például, ha a szín textúra - (R, G, B), és a színe a objektum, amelyhez alkalmazzuk, - (r0, G0, b0), a kapott szín - (R * r0, g * G0, b * b0) . Ha az objektum fekete színű - (0,0,0), akkor nem fogja látni a textúra, így lesz teljesen fekete. A második használati mód, amikor a színe a tárgy nem tekinthető. A kapott szín a szín a textúra. Ezeket a paramétereket lehet beállítani az alábbiak szerint.

Alapértelmezés szerint azt mondta, hogy ez GL_MODULATE mód. Most, hogy az aktív textúra space_tex. És megint ugyanaz neki. Ezzel befejeződött a létrehozását textúrák. Így is marad kapcsolódó textúra koordinátákat az objektum koordinátáit. Szerkesztése a kijelző funkció az alábbiak szerint:

Mint azt bizonyára kitalálta, glTexCoord2d megegyezik a textúra koordinátákat a quad. Kivéve azt, hogy a bal alsó sarokban egy textúra koordináta (0,0), és a jobb felső - (1,1).

Az OpenGL - munka képekkel

A forrás fájl itt. Végrehajtható itt.
Saját képet. Csillagos ég itt.

5.5 Ismétlődő textúra

Ripple textúra a gépen nem túl nehéz. Nézzük szerkeszteni a programot az előző részben. Annak érdekében, hogy meg tudja ismételni a textúra, telepíteni kell GL_REPEAT lehetőség a S és T koordinátákat. S-koordinátája a textúra - ez a horizontális koordináta, T-koordináta - függőleges. A második paraméter lehet beállítani a koordinátákat, - GL_CLAMP. Ez biztosítja, hogy a textúra nem lehet reprodukálni. Az alapértelmezett GL_REPEAT. De én még mindig így a megfelelő kódot, amit képviselnek, hogyan kell beállítani ezt a paramétert. A fő funkciója, adjuk hozzá a következő sorokat:

Most módosítsa a megjelenítési funkciót.

glTexCoord funkció kötődik a textúra koordinátákat a csúcsai a tárgy. Amint azt korábban említettük, a bal alsó sarokban a textúra koordinátákat (0,0), és a jobb felső - (1,1). Ha megadja a horgony érték nagyobb, mint egy, a textúra ismétlődik. Példánkban a koordináta (0,0) textúra mi kötve a bal alsó vertex sík koordináta (-4, -4), és a koordináta (3.2) a struktúra a jobb felső csúcs (4,4). Így van a szorzás textúra vízszintesen az összeget három darab, és függőlegesen az összeg két darab. A másik két csúcsot, azt kötve rendesen. Ha nincs a számok azt jelzik, hogy a kép meg van döntve.

Az OpenGL - munka képekkel

A forrás fájl itt. Végrehajtható itt.
Saját képet. Csillagos ég itt.

5.6 Feladat: „Forgatás textúra”

Zavraschayte sík fotó tengely körül az X és Y is hagyjuk, hogy változik egyenletesen a Z tengely mentén 3-7.

Az OpenGL - munka képekkel

A forrás fájl itt. Végrehajtható itt.
Saját képet. Csillagos ég itt.

5.7 A textúra a gömb

Itt fogom mutatni, hogyan kell dolgozni egy egységes szerkezetű, és alkalmazza a textúra a gömböt. Hozzon létre egy új projektet a neve a gömb. Hozzá egy globális változót.

A fő terhet egy képet, és hozzon létre a textúra. Mivel a textúra van ebben az app csak egy, nem szükséges, hogy hozzon létre egy azonosítót is.

Módosítsa a megjelenített funkciót. Itt minden ismerős, lásd. 4.1, kivéve gluQuadricTexture. Ez a funkció lehetővé teszi vagy letiltja a textúraleképezési a háromdimenziós objektumot. A második paraméter GL_TRUE vagy GL_FALSE. Az alapértelmezett textúraieképezésre tilos.

Az OpenGL - munka képekkel

A forrás fájl itt. Végrehajtható itt.
Saját képet.

5.8 Gyakorlat "Texture to Life"

Alkalmazza textúrát a henger, kúp, és a részleges meghajtók. Képként, hogy néhány mozaik, borsó, stb mert valami nem túl jó néz értelmes.

5.9 Texture a teáskanna

A textúra lehet alkalmazni tárgyak a komplexitás. Erre a célra van szükség ahhoz, hogy automatikusan generál textúra koordinátákat - glEnable (GL_TEXTURE_GEN_S) és glEnable (GL_TEXTURE_GEN_T). Ezután kell telepíteni az egyik a három generációs textúra koordináták algoritmusok.

  1. GL_OBJECT_LINEAR
  2. GL_EYE_LINEAR
  3. GL_SPHERE_MAP

koordináta algoritmussal felhasználásával létrehozott glTexGeni funkciót. Az első paraméter típusát jelzi koordinátái függvényében, amelyre az algoritmus lesz beállítva. GL_S vízszintesen koordinálja, GL_T - függőleges. A második paraméter ennek a funkciónak kell lennie GL_TEXTURE_GEN_MODE. És a harmadik paraméter - az egyik algoritmusok fent felsorolt. Hozzon létre egy másik projekt néven teáskanna. Szerkesztése a fő funkciója, mint az előző program, ahol egymásra vetíti a képet a gömböt. Csak adj egy sort, glEnable (GL_AUTO_NORMAL), a kanna nézett ki jobban. Ez a mód lehetővé teszi a számítás a normál vektorok, amely lehetővé teszi, hogy szerezzen egy jobb képet, de bizonyos időt vesz igénybe. A kijelző funkció, szerkesztés, az alábbiak szerint.

Az OpenGL - munka képekkel

A forrás fájl itt. Végrehajtható itt.
Saját képet.

Az OpenGL - munka képekkel

Az OpenGL - munka képekkel

A forrás fájl itt. Végrehajtható itt.

5.10 Gyakorlat „textúrát a tórusz”

Hogy ugyanazt a programot csak a tórusz.