Munka OpenGL kiterjesztések és a multi-textúrázás - grafika (OpenGL) - Cikkek Directory - viledog

Munka OpenGL kiterjesztések és multi-textúrázás

Munka OpenGL kiterjesztések és multi-textúrázás

Ebben a cikkben fogunk összpontosítani, hogyan működik bővítmények OpenGL grafikus könyvtár.
Megpróbálok többet mondani, mint lehetséges, hogy hogyan ellenőrizze az adott kiterjesztés, és hogyan kell csatlakoztatni a program későbbi használatra. Mindez azt fogja bemutatni a példa a leggyakoribb kiterjesztés - GL_ARB_multitexture felelős multi-textúrázás, azaz a lehetőséget, hogy alkalmazni kell egy objektum több textúrát át.

#ifndef GL_EXTENSIONS_H
#define GL_EXTENSIONS_H

A #include // OpenGL könyvtár
#include // csatlakoztatása a kiterjesztések
#include // Ha csatlakozni a Windows (WGL.) bővítmények
#pragma figyelmeztetés (letiltani. 4786)

A következő a függvény prototípus célja annak meghatározása, ha támogatja a bővítés, vagy sem. Leírás funkcióban GLextensions.cpp a fájlban tárolt és később tárgyaljuk.

// ******* F-I ellenőrizze kiterjesztése ********
bool GetGLExt (char * extname unsigned char * string);

Most, valójában a prototípusa a szükséges funkciókat multitexture. Leírás sok más f-TIONS megtalálható glext.h fájlt.

// >>>>>>>>>>> GL_ARB_multitexture <<<<<<<<<<<<<<<<<<<
extern PFNGLMULTITEXCOORD1FARBPROC glMultiTexCoord1fARB;
extern PFNGLMULTITEXCOORD2FARBPROC glMultiTexCoord2fARB;
extern PFNGLMULTITEXCOORD3FARBPROC glMultiTexCoord3fARB;
extern PFNGLMULTITEXCOORD4FARBPROC glMultiTexCoord4fARB;

extern PFNGLMULTITEXCOORD1FVARBPROC glMultiTexCoord1fvARB;
extern PFNGLMULTITEXCOORD2FVARBPROC glMultiTexCoord2fvARB;
extern PFNGLMULTITEXCOORD3FVARBPROC glMultiTexCoord3fvARB;
extern PFNGLMULTITEXCOORD4FVARBPROC glMultiTexCoord4fvARB;

extern PFNGLACTIVETEXTUREARBPROC glActiveTextureARB;
extern PFNGLCLIENTACTIVETEXTUREARBPROC glClientActiveTextureARB;

És a prototípus funkcióban, amely azt fogja kezdeményezni a szükséges meghosszabbítását velünk, akkor azt képes lesz biztonságosan használható. Leírás funkcióban GLextensions.cpp is tárolja a fájlt, és az alábbiakban tárgyaljuk.

Tulajdonképpen mit mondtam fent :)

Most tekintsünk GLextensions.cpp. Ez a fájl tartalmazza a felfedezés és inicializálása kiterjesztéseket. Nézzük meg a sorrendben.

// ******* F-I ellenőrizze kiterjesztése ********
bool GetGLExt (char * extname unsigned char * string)
// tésztát a jelenléte a kiterjesztése.
if (strstr ((const char *) húr, extname))
return true; // A típus található. visszaút OK!
>
return false; // nem található. visszatérés nem sikerült.
>

Ahogy talán már észre, ez f-CIÓ csak keres egy sort a többi, ahogy keresünk egy szót vagy kifejezést bármilyen szöveges dokumentum.
Következő, kinyilvánítjuk funkció-bővítés:

// >>>>>>>>>>> GL_ARB_multitexture <<<<<<<<<<<<<<<<<<<
PFNGLMULTITEXCOORD1FARBPROC glMultiTexCoord1fARB = NULL;
PFNGLMULTITEXCOORD2FARBPROC glMultiTexCoord2fARB = NULL;
PFNGLMULTITEXCOORD3FARBPROC glMultiTexCoord3fARB = NULL;
PFNGLMULTITEXCOORD4FARBPROC glMultiTexCoord4fARB = NULL;

PFNGLMULTITEXCOORD1FVARBPROC glMultiTexCoord1fvARB = NULL;
PFNGLMULTITEXCOORD2FVARBPROC glMultiTexCoord2fvARB = NULL;
PFNGLMULTITEXCOORD3FVARBPROC glMultiTexCoord3fvARB = NULL;
PFNGLMULTITEXCOORD4FVARBPROC glMultiTexCoord4fvARB = NULL;

PFNGLACTIVETEXTUREARBPROC glActiveTextureARB = NULL;
PFNGLCLIENTACTIVETEXTUREARBPROC glClientActiveTextureARB = NULL;

Nos, a funkciók be, most meg kell, hogy azok működjenek. És mi csináljuk az indító f-CIÓ az alábbiak szerint:

void InitGL_multitexture (void)
glMultiTexCoord1fARB = (PFNGLMULTITEXCOORD1FARBPROC) wglGetProcAddress ( "glMultiTexCoord1fARB");
glMultiTexCoord2fARB = (PFNGLMULTITEXCOORD2FARBPROC) wglGetProcAddress ( "glMultiTexCoord2fARB");
glMultiTexCoord3fARB = (PFNGLMULTITEXCOORD3FARBPROC) wglGetProcAddress ( "glMultiTexCoord3fARB");
glMultiTexCoord4fARB = (PFNGLMULTITEXCOORD4FARBPROC) wglGetProcAddress ( "glMultiTexCoord4fARB");

glMultiTexCoord1fvARB = (PFNGLMULTITEXCOORD1FVARBPROC) wglGetProcAddress ( "glMultiTexCoord1fvARB");
glMultiTexCoord2fvARB = (PFNGLMULTITEXCOORD2FVARBPROC) wglGetProcAddress ( "glMultiTexCoord2fvARB");
glMultiTexCoord3fvARB = (PFNGLMULTITEXCOORD3FVARBPROC) wglGetProcAddress ( "glMultiTexCoord3fvARB");
glMultiTexCoord4fvARB = (PFNGLMULTITEXCOORD4FVARBPROC) wglGetProcAddress ( "glMultiTexCoord4fvARB");

glActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC) wglGetProcAddress ( "glActiveTextureARB");
glClientActiveTextureARB = (PFNGLCLIENTACTIVETEXTUREARBPROC) wglGetProcAddress ( "glClientActiveTextureARB");
>

Nos, majdnem véget ért. Minden mi maradt kell tennie, hogy ültessék át a gyakorlatba a frissen vert bővítése. Ehhez fogjuk tölteni két textúrák és előírja azokat a négyzeteket: 1. - az egyik textúra, 2. - A második struktúra, a harmadik - a két textúra.
Töltsük be a textúra fogjuk használni az F-CIÓ a auxDIBImageLoad GLAUX könyvtár, de lehet csinálni nélküle létrehozhatja a saját f-CIÓ terhelés .bmp fájlokat (hogyan kell csinálni ezt el tudja olvasni az „ez” a cikket). Töltse le a kódot, nem adom, így csak a kód OTMULTITEKSTURENNOGO téren. A többit képes lesz felfedezni az ásó a forráskód csatlakozik a cikk végén.

érvényteleníti renderTex01 ()
glPushMatrix ();
// aktiválása az első textúra egység,
// de nem tudjuk ezt feleslegesen, ő már alapértelmezés szerint aktív.
glActiveTextureARB (GL_TEXTURE0_ARB);
// engedélyezése textúra az 1. textúra egység
glEnable (GL_TEXTURE_2D);
// Bind az első textúra az 1. textúra egység
glBindTexture (GL_TEXTURE_2D, tex0);

// aktiválása a második textúra egység
glActiveTextureARB (GL_TEXTURE1_ARB);
// engedélyezése textúra a 2. textúra egység
glEnable (GL_TEXTURE_2D);
// Bind második textúrát a 2. textúra egység
glBindTexture (GL_TEXTURE_2D, tex1);

// négyzet rajzolásához
glTranslatef (0.7f, -0.5f, -3.0f);
glBegin (GL_QUADS);
// a textúrát koordináták az első textúra egység.
glMultiTexCoord2fARB (GL_TEXTURE0_ARB, 0.0f, 0.0f);
// és a második.
glMultiTexCoord2fARB (GL_TEXTURE1_ARB, 0.0f, 0.0f);
glVertex2f (0.0f, 0.0f); // felhívni az első csúcs.
// ugyanezt a fennmaradó 3 csúcsot.
glMultiTexCoord2fARB (GL_TEXTURE0_ARB, 1.0f, 0.0f);
glMultiTexCoord2fARB (GL_TEXTURE1_ARB, 1.0f, 0.0f);
glVertex2f (1.0f, 0.0f);
glMultiTexCoord2fARB (GL_TEXTURE0_ARB, 1.0f, 1.0f);
glMultiTexCoord2fARB (GL_TEXTURE1_ARB, 1.0f, 1.0f);
glVertex2f (1.0f, 1.0f);
glMultiTexCoord2fARB (GL_TEXTURE0_ARB, 0.0f, 1.0f);
glMultiTexCoord2fARB (GL_TEXTURE1_ARB, 0.0f, 1.0f);
glVertex2f (0.0f, 1.0f);
kéreg ();

// kikapcsolása textúra a 2. textúra egység
glDisable (GL_TEXTURE_2D);
// aktiválása az első textúra egység
glActiveTextureARB (GL_TEXTURE0_ARB);
// kikapcsolása textúra az 1. textúra egység
glDisable (GL_TEXTURE_2D);
glPopMatrix ();
>

Nos, ez minden! Továbbra is csak eltávolítani a textúra létre, mint ez:

void ShutdownTextures ()
// megtisztítja maga után
glDeleteTextures (1 tex0);
glDeleteTextures (1 tex1);
>

Hívja ezt a f-CIÓ a kilépés a programot, és mindent.

Remélhetőleg ez az anyag hasznos volt az Ön számára. Ami nem világos, kérdez ...