Lucrul cu extensii opengl și multitexturi - grafice (opengl) - catalog de articole - viledog

Lucrul cu extensiile OpenGL și multitext

Lucrul cu extensiile OpenGL și multitext

Acest articol este despre modul de lucru cu extensiile bibliotecii grafice OpenGL.






Voi încerca să explic în cât mai multe detalii posibil cum să verificați disponibilitatea unei extensii și cum să o conectați la programul dvs. pentru o utilizare ulterioară. Toate acestea voi demonstra cu exemplul celei mai comune extensii - GL_ARB_multitexture responsabile pentru multitexturi, adică Pentru abilitatea de a impune obiectelor mai multe texturi într-o singură trecere.

#ifndef GL_EXTENSIONS_H
#define GL_EXTENSIONS_H

#include // biblioteca noastră OpenGL
#include // Pentru a conecta extensiile
#include * Pentru a conecta extensiile Windows (wgl.)
avertizare #pragma (dezactivați 4786)

Următorul este o funcție de prototip concepută pentru a determina dacă extensia noastră este acceptată sau nu. Descrierea fișierului este în fișierul GLextensions.cpp și va fi discutată ulterior.

// ******* Verificarea extensiilor ********
bool GetGLExt (char * extName, șir nesemnat char * string);

Acum, de fapt, există un prototip al funcțiilor noastre necesare pentru multitext. O descriere a acestor multe alte funcții se găsește în fișierul glext.h.

// >>>>>>>>>>> GL_ARB_multeexture <<<<<<<<<<<<<<<<<<<
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;

Și prototipul f-tiunii, pe care vom inițializa expansiunea de care avem nevoie, după care o putem folosi în liniște. Descrierea funcției este de asemenea găsită în fișierul GLextensions.cpp și va fi discutată mai jos.

De fapt, ceea ce am menționat mai sus :)

Acum, luați în considerare GLextensions.cpp. Acest fișier conține funcțiile pentru detectarea și inițializarea extensiilor. Să privim totul în ordine.

// ******* Verificarea extensiilor ********
bool GetGLExt (char * extName, șir nesemnat char * șir)
// Testați pentru prezența unei extensii.
dacă (strstr ((const char *) șir, extName))
return true; // Tip găsit. retur OK!
>
return false; // Tipul nu a fost găsit. vom întoarce un eșec.
>

După cum ați observat deja, această funcție doar caută o linie în alta, exact așa cum căutăm un cuvânt sau o frază într-un document text.
Apoi, vom anunța funcțiile de extensie:

// >>>>>>>>>>> GL_ARB_multeexture <<<<<<<<<<<<<<<<<<<
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;

Ei bine, funcțiile au fost anunțate, acum trebuie să le ducem la muncă. Și o vom face în inițierea ff după cum urmează:

void InitGL_multeexture (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");
>

Aproape că am ajuns până la capăt. Tot ce trebuie să facem este să aplicăm extensiile noi. Pentru aceasta încărcăm două texturi și le punem pe trei pătrate: 1d - o textura, 2d - a doua textura, 3d - ambele texturi.
Încărcați textura vom utiliza f-TION bibliotecii auxDIBImageLoad GLAUX, dar puteți face fără ea, prin crearea de fișiere proprii de încărcare f-TION .bmp (despre modul de a face acest lucru puteți citi în „acest“ articol). Nu voi da codul de descărcare, voi da doar codul pătratului CANCELED. Ceilalți vă puteți explora pe voi înșivă în codul sursă atașat la sfârșitul articolului.

void renderTex01 ()
glPushMatrix ();
// Activați primul modul de textură,
// dar nu puteți să o faceți, deoarece este deja activ în mod implicit.
glActiveTextureARB (GL_TEXTURE0_ARB);
// Porniți texturarea pentru modulul de textura 1
glEnable (GL_TEXTURE_2D);
Legați prima textură a modulului de textură din primul rând
glBindTexture (GL_TEXTURE_2D, tex0);

// Activați al doilea modul de texturare
glActiveTextureARB (GL_TEXTURE1_ARB);
// Include textură pentru cel de-al doilea modul de textură
glEnable (GL_TEXTURE_2D);
// Atașați a doua textură la cel de-al doilea modul de texturare
glBindTexture (GL_TEXTURE_2D, tex1);

/ / trage un pătrat
glTranslatef (0,7f, -0,5f, -3,0f);
glBegin (GL_QUADS);
// setați coordonatele texturii pentru primul modul de texturare.
glMultiTexCoord2fARB (GL_TEXTURE0_ARB, 0.0f, 0.0f);
// și pentru al doilea.
glMultiTexCoord2fARB (GL_TEXTURE1_ARB, 0.0f, 0.0f);
glVertex2f (0.0f, 0.0f); // trageți primul vârf.
// același pentru celelalte trei noduri.
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);
glEnd ();

// dezactivați texturarea pentru cel de-al doilea modul de texturare
glDisable (GL_TEXTURE_2D);
// Activați primul modul de texturare
glActiveTextureARB (GL_TEXTURE0_ARB);
// dezactivați texturarea pentru modulul de textura 1
glDisable (GL_TEXTURE_2D);
glPopMatrix ();
>

Asta-i tot! Rămâne doar să ștergeți texturile create astfel:

void ShutdownTextures ()
// Ne cuream singuri
glDeleteTexturi (1, tex0);
glDeleteTexturi (1, tex1);
>

Apelați această funcție când ieșiți din program și asta este.

Sper că acest material a fost util pentru dvs. Ce nu este clar cere ...







Trimiteți-le prietenilor: