5. fejezet alapjai OpenGL, könyv Igor Tarasov, tankönyv példák

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:
  • Töltsön fel egy képet a memóriában
  • Adjon meg egy nevet azonosító textúra
  • Legyen aktív
  • Hozza létre a színes térkép memória
  • Állítsa be a paramétereket a textúra
  • Állítsa be a paramétereket a kölcsönhatás a tárgy textúrák
  • 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 kell egy mérete 2 n x 2 m. 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. Eredmény masshabirovaniya nem intézkedik. Tehát, azt 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 éppen ellenkezőleg, adni, 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élda írásban a könyvet. Köztük volt példa a jól ismert Red Book példákat, MSDN, az internetről é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 komolyabb 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 vagy falra szerelhető: 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, adjuk 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. Között textúra beállítások helyett a részletesség szintjét, és ahogyan masshabirovaniya kötelező textúra az objektumot. 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ép mérete 2 n x2 m. első szinten - 2 n-1 x2 m-1. k-adik szint - 2 n-k X2 m-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 garnitsy nem fogunk, í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 - a paraméter határozza meg a textúra, hogy 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).

    5. fejezet alapjai OpenGL, könyv Igor Tarasov, tankönyv példák

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