Textúrák - multi-textúrázás, órák és programozási példákat

Keresés fotók Geo Location:

* Mi multiteksturing? *
Multiteksturing - jelentése 2 vagy több réteg textúrák egymásra.
Ez létrehozásához használt fény térképek, árnyék, és egyéb grafikai technikákkal.
Elvileg lehet elérni ugyanazt a hatást, anélkül multiteksturinga de
akkor meg kell, hogy dolgozza át az azonos geometriai többször.
Például, akkor dolgozzon a falra, majd egy kicsit előtte felhívni
fény térképet.


Multiteksturing állt rendelkezésre OpenGL azonnal.
API multiteksturinga úgynevezett "kiterjesztése" (mellék).
Annak érdekében, hogy a kiterjesztés, akkor sem tartoznak bele a projekt, illetve annak érdekében, hogy
mellékelt „glext.h”, amely tartalmazza az összes létező bővítmények. Ha azt veszi észre őket
van egy csomó. Expansion - ezek azok a dolgok, amelyek, bár
Ez egy szabványos API, de hozzátette, hogy a képességeit. a multitexture
szükség van a legújabb verzióját OpenGL. Annak kiderítésére, hogy tud dolgozni
multitexturálás próbálja glGetString funkció (GL_EXTENSIONS).
Ez adja vissza (char *), amely tartalmazza az összes rendelkezésre álló bővítmények.

A kód a bemutató venni a leckét „Loading textúrák”.

A változások érintik csak a main.cpp file:


// Kezdetben hozzá még egy Heder:
#include "glext.h"


// Aztán számának növelése betöltött textúrák négy:
textureImage textúrák # 91; 4 # 93; ;
// ^


/ *
Ez a program 2 példa multiteksturinga.
Az első - egy egyszerű térképet a világ, és a második - statikus háttér kúszik
rajta felhők kártyát.
Ahhoz, hogy a kiterjesztés, meg kell betölteni funkcióját az OpenGL DLL.
Nézzük meg a kódot.

Vannak olyan funkciók, amelyek szabályozzák multitextúrás. Ők lesznek betöltve
hívó wglGetProcAddress (). Meg kell adni „glext.h”, vagy azok defaynit
írja be a kódot. Ha nem, akkor nem kell a prototípus
multiteksturinga funkciókat.
ARB == Architecture Review Board. A részletek megtalálhatók az interneten, de
Alapvetően mit csinálnak - segít Alibaba OpenGL szabványoknak.

A következő mutatókat funkciók lehetővé teszik számunkra, hogy meghatározza, hogy milyen textúra néhány
akarjuk kapcsolni. A nagyon eljárás látni fogja RenderScene ().
* /

// Most térjünk vissza az inicializálási funkció (init ()):
void init # 40; hWND hWND # 41;
# 123;
g_hWnd = hwnd;
GetClientRect # 40; g_hWnd. g_rRect # 41; ;
InitializeOpenGL # 40; g_rRect. jobbra. g_rRect. alsó # 41; ;

// Beállítjuk az első osztály
Texture = new CTexture # 40; # 41; ;

// Meg kell reklám és fogyasztásra kész multiteksturinga funkciók
// nézzük meg a meghajtót a megfelelő verzió OpenGL.
// Ha a kiterjesztés funkciót nem található, függvénymutatók lesz NULL
ha # 40;. glActiveTextureARB ||. glMultiTexCoord2fARB # 41;
# 123;
// nyomtatása hibaüzenetet és kilép.
MessageBox # 40; NULL. „A változat OpenGL nem támogatja multitextúrás”. „Hiba”. MB_OK # 41; ;
PostQuitMessage # 40; 0 # 41; ;
# 125;

// Mi lesz 4 textúra. Az általunk használt CTexture osztály lehívhatók.
Texture -> LoadTexture # 40; IL_BMP. "Bitmap.bmp". textúrák # 91; 0 # 93; # 41; ;
Texture -> LoadTexture # 40; IL_BMP. "LightMap.bmp". textúrák # 91; 1 # 93; # 41; ;
Texture -> LoadTexture # 40; IL_BMP. "Cove.bmp". textúrák # 91; 2 # 93; # 41; ;
Texture -> LoadTexture # 40; IL_BMP. "Fog.bmp". textúrák # 91; 3 # 93; # 41; ;
# 125;


// És végül folytassa a rajzot.
// RenderScene () funkció:

void RenderScene # 40; # 41;
# 123;
glClear # 40; GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT # 41; ;
glLoadIdentity # 40; # 41; ;

// menjen vissza, hogy a tér:
glTranslatef # 40; 0 0 - 7. # 41; ;

// Állítsa az aktív textúra ID először, majd köti a textúra tégla, hogy ezt az azonosítót.
// előtt Bindi textúra, meg kell hívni: glEnable (GL_TEXTURE_2D);
glActiveTextureARB # 40; GL_TEXTURE0_ARB # 41; ;
glEnable # 40; GL_TEXTURE_2D # 41; ;
glBindTexture # 40; GL_TEXTURE_2D. textúrák # 91; 0 # 93;. texID # 41; ;

// Hogy a második textúra id aktív és zabindit a világtérképet az ID.
glActiveTextureARB # 40; GL_TEXTURE1_ARB # 41; ;
glEnable # 40; GL_TEXTURE_2D # 41; ;
glBindTexture # 40; GL_TEXTURE_2D. textúrák # 91; 1 # 93;. texID # 41; ;

// Mivel azt szeretnénk mozgatni texturált terek különböző koordinátákat,
// hívjuk az új mátrixba, hogy a változások nem érintik a többi négyzet.
glPushMatrix # 40; # 41; ;
// Az aktuális mátrix a tér mozog a bal oldalon a képernyő
glTranslatef # 40; - 2 0 0 # 41; ;

// Itt multisampled tér bal oldalán a képernyő
glBegin # 40; GL_QUADS # 41; ;
// Most, az F-ek glMultiTextCoord2fARB () helyett glTextCoord2f (),
// adja textúra koordinátákat az egyes textúra. Ez lehetővé teszi,
// haladunk a textúrát egy teljesen más helyen.
// Egy kiváló példa erre - az árnyékban. glMultiTexCoord2fARB () veszi
// ID textúrák, amit jelzik a megfelelő textúra koordinátákat.
// Most ugyanazt a koordinátákat az egyes textúra.

// bal felső sarokban
glMultiTexCoord2fARB # 40; GL_TEXTURE0_ARB. 0.0f. 1.0f # 41; ;
glMultiTexCoord2fARB # 40; GL_TEXTURE1_ARB. 0.0f. 1.0f # 41; ;
glVertex3f # 40; - 1. 1. 0 # 41; ;

// bal alsó sarokban
glMultiTexCoord2fARB # 40; GL_TEXTURE0_ARB. 0.0f. 0.0f # 41; ;
glMultiTexCoord2fARB # 40; GL_TEXTURE1_ARB. 0.0f. 0.0f # 41; ;
glVertex3f # 40; - 1 - 1 0 # 41; ;

// Jobb alsó sarok
glMultiTexCoord2fARB # 40; GL_TEXTURE0_ARB. 1.0f. 0.0f # 41; ;
glMultiTexCoord2fARB # 40; GL_TEXTURE1_ARB. 1.0f. 0.0f # 41; ;
glVertex3f # 40; 1 - 1 0 # 41; ;

// jobb felső sarokban
glMultiTexCoord2fARB # 40; GL_TEXTURE0_ARB. 1.0f. 1.0f # 41; ;
glMultiTexCoord2fARB # 40; GL_TEXTURE1_ARB. 1.0f. 1.0f # 41; ;
glVertex3f # 40; 1. 1. 0 # 41; ;
kéreg # 40; # 41; ;
//, és lépjen ki a mátrix mozgás nem befolyásolja a következő téren.
glPopMatrix # 40; # 41; ;

// Most levelet második példa multiteksturinga a jobb oldalon a képernyő.
// tudjuk hozzárendelése új textúrákat használni GL_TEXTURE * _ARB.
// Jól jönne GL_TEXTURE2_ARB és GL_TEXTURE3_ARB, de ez nem feltétlenül szükséges.

// engedélyezése az első azonosítót és Kötözzétek háttér:
glActiveTextureARB # 40; GL_TEXTURE0_ARB # 41; ;
glBindTexture # 40; GL_TEXTURE_2D. textúrák # 91; 2 # 93;. texID # 41; ;

// A második azonosító zabindit textúra füst.
glActiveTextureARB # 40; GL_TEXTURE1_ARB # 41; ;
glBindTexture # 40; GL_TEXTURE_2D. textúrák # 91; 3 # 93;. texID # 41; ;

// Hogy a füst reálisabb, hogy neki fölött lebegnek a háttérben.
// Erre teremt a statikus úszó, amely tartalmaz egy elmozdulásmérő.
// Mivel a textúra - GL_WRAP lesz folytonosság hatása.

// Létrehozunk a számláló
statikus float pakolás = 0;

// Shift a téren, hogy a megfelelő
glTranslatef # 40; 2. 0. 0 # 41; ;

//, és kezdjen rajzolni
glBegin # 40; GL_QUADS # 41; ;
// Döntetlen bal felső vertex textúra koordináták kivonjuk a számláló,
// görgetésre hatást érünk el.
glMultiTexCoord2fARB # 40; GL_TEXTURE0_ARB. 0.0f. 1.0f # 41; ;
glMultiTexCoord2fARB # 40; GL_TEXTURE1_ARB. 0.0f - csomagolja. 1.0f # 41; ;
glVertex3f # 40; - 1. 1. 0 # 41; ;

// bal alsó vertex
glMultiTexCoord2fARB # 40; GL_TEXTURE0_ARB. 0.0f. 0.0f # 41; ;
glMultiTexCoord2fARB # 40; GL_TEXTURE1_ARB. 0.0f - csomagolja. 0.0f # 41; ;
glVertex3f # 40; - 1 - 1 0 # 41; ;

// jobb alsó vertex
glMultiTexCoord2fARB # 40; GL_TEXTURE0_ARB. 1.0f. 0.0f # 41; ;
glMultiTexCoord2fARB # 40; GL_TEXTURE1_ARB. 1.0f - csomagolja. 0.0f # 41; ;
glVertex3f # 40; 1 - 1 0 # 41; ;

// jobb felső csúcsa
glMultiTexCoord2fARB # 40; GL_TEXTURE0_ARB. 1.0f. 1.0f # 41; ;
glMultiTexCoord2fARB # 40; GL_TEXTURE1_ARB. 1.0f - csomagolja. 1.0f # 41; ;
glVertex3f # 40; 1. 1. 0 # 41; ;
kéreg # 40; # 41; ;

// növelése elmozdulásmérő
csomagolja + = 0.0015f;


SwapBuffers # 40; g_hDC # 41; ;
# 125;


Ez az! Fogadok azt hitted, hogy meg kell dolgozni egy kicsit, nem?
A jövőben lesz képes háttérbe szorítani bármilyen felületre, ezzel háttér világosabb, és így tovább
vkusnoty fajta. Szükséged lesz EXT_texture_env_combine kiterjesztése.
További információk az lesz a jövőben tanulságokat. Ez a kiterjesztés lehetővé teszi, hogy
bump-mapping gyakorlat nagyon, nagyon gyors.

PFNGLMULTITEXCOORD2FARBPROC glMultiTexCoord2fARB = NULL;
PFNGLACTIVETEXTUREARBPROC glActiveTextureARB = NULL;

glActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC) wglGetProcAddress ( "glActiveTextureARB");
glMultiTexCoord2fARB = (PFNGLMULTITEXCOORD2FARBPROC) wglGetProcAddress ( "glMultiTexCoord2fARB");

3) Ha minden készen áll a renderelő kell kötni a textúra multitexture ID.
Ez az azonosító akkor tudjuk használni, hogy meghatározza, hogy milyen multiteksture hozzárendelése
koordinátákat.

glActiveTextureARB (GL_TEXTURE0_ARB);
glEnable (GL_TEXTURE_2D);
glBindTexture (GL_TEXTURE_2D, textúrák [0] .texID);

4) Most, hogy a textúrát koordinátákat a textúra, csak
peredaom többtextúrás ID, amire szükségünk van.

glMultiTexCoord2fARB (GL_TEXTURE0_ARB, 0.0f, 1.0f);
glMultiTexCoord2fARB (GL_TEXTURE1_ARB, 0.0f - pakolás, 1.0f);
glVertex3f (-1, 1, 0);

Ez az! Élvezze;)

Kapcsolódó cikkek