Texturi - multitext, lecții și exemple de programare

Căutați fotografii după geo-locație:

* Ce este multitextul? *
Multitextarea este de 2 sau mai multe straturi de texturi suprapuse între ele.
Este folosit pentru a crea hărți ușoare, umbre și alte tehnici grafice.






În principiu, puteți obține aceleași efecte fără multitext, dar
va trebui să repetați aceeași geometrie mai mult decât o dată.
De exemplu, puteți desena un perete, și apoi puțin înainte de a trage
harta luminoasă.


Multitextul nu a fost disponibil în OpenGL simultan.
API pentru multitexturi se numește "extensie".
Pentru a activa extensia, puteți să o includeți în proiect sau să o activați
atașat "glext.h", care conține toate extensiile existente. Dacă observați, ei
acolo tone. Extensiile sunt lucruri care, deși sunt
în afara standardului API, dar adăugat la capabilitățile sale. Pentru multitext
aveți nevoie de cea mai recentă versiune de OpenGL. Pentru a afla dacă puteți colabora
multitexturing, încercați să utilizați funcția glGetString (GL_EXTENSIONS).
Se întoarce (char *), care conține toate extensiile disponibile.

Codul pentru această lecție este preluat din lecția "Încărcarea texturilor".

Modificările afectează numai fișierul principal.cpp:


// La inceput adaugam si unul:
#include "glext.h"


// Apoi crește numărul de texturi încărcate la patru:
TextureImage textures # 91; 4 # 93; ;
// ^


/ *
Acest program oferă 2 exemple de multitext.
Prima este o hartă simplă a luminii, iar cea de-a doua este un fundal static cu un târâș
pe ea o hartă de nori.
Pentru a utiliza extensiile, trebuie să încărcați funcții din DLL OpenGL.
Să aruncăm o privire la cod.

Există funcții care controlează multitextul. Acestea vor fi descărcate
apelați wglGetProcAddress (). Trebuie să activați "glext.h" sau să le defilați
tipuri în codul dvs. Dacă nu, nu veți avea prototipuri
funcții de multitext.
ARB == Consiliul de analiză a arhitecturii. Detaliile pe care le puteți găsi pe Internet, dar
principalul lucru pe care îl fac este de a declara standardele OpenGL.

Următorii indicatori de funcții ne permit să specificăm texturile cu care
vrem să ne legăm. Procesul propriu-zis îl veți vedea în RenderScene ().
* /

// Acum mergeți la funcția de inițializare (Init ()):
void Init # 40; HWND hWnd # 41;
# 123;
g_hWnd = hWnd;
GetClientRect # 40; g_hWnd. g_rRect # 41; ;
InitializeOpenGL # 40; g_rRect. dreapta. g_rRect. fund # 41; ;

// Initializeaza clasa
Textura = noua ciment # 40; # 41; ;

// Avem nevoie de funcțiile declarate și gata de utilizare ale multitextului,
// să ne asigurăm că versiunea necesară a OpenGL este prezentă pe mașină.
// Dacă funcția extensie nu este găsită, indicatorii funcției vor fi NULL
dacă # 40; glActiveTextureARB ||. glMultiTexCoord2fARB # 41;
# 123;
// Imprimați un mesaj de eroare și renunțați.
MessageBox # 40; NULL. "Versiunea dvs. de OpenGL nu acceptă multitexturi". „Eroare“. MB_OK # 41; ;
PostQuitMessage # 40; 0 # 41; ;
# 125;

// Vom avea 4 texturi. Utilizați clasa CTexture pentru a le încărca.
Textură -> LoadTexture # 40; IL_BMP. "Bitmap.bmp". texturi # 91; 0 # 93; # 41; ;
Textură -> LoadTexture # 40; IL_BMP. "LightMap.bmp". texturi # 91; 1 # 93; # 41; ;
Textură -> LoadTexture # 40; IL_BMP. "Cove.bmp". texturi # 91; 2 # 93; # 41; ;
Textură -> LoadTexture # 40; IL_BMP. "Fog.bmp". texturi # 91; 3 # 93; # 41; ;
# 125;


În sfârșit, vom începe să desenăm.
// Funcția RenderScene ():

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

// Mutare înapoi pentru a vedea pătratul nostru:
glTranslatef # 40; 0. 0, - 7 # 41; ;







/ / Setați ID-ul activ al primei texturi la cea activă, apoi vom îndoi textura cărămizilor la acest ID.
// Înainte de a lega o textură, trebuie să apelați: glEnable (GL_TEXTURE_2D);
glActiveTextureARB # 40; GL_TEXTURE0_ARB # 41; ;
glEnable # 40; GL_TEXTURE_2D # 41; ;
glBindTexture # 40; GL_TEXTURE_2D. texturi # 91; 0 # 93;. texID # 41; ;

// Faceți id-ul celei de-a doua texturi active și uciși harta noastră de lumină pe acest ID.
glActiveTextureARB # 40; GL_TEXTURE1_ARB # 41; ;
glEnable # 40; GL_TEXTURE_2D # 41; ;
glBindTexture # 40; GL_TEXTURE_2D. texturi # 91; 1 # 93;. texID # 41; ;

// Deoarece vrem să mutăm pătratele texturate la coordonate diferite,
// numim o nouă matrice, astfel încât modificările să nu afecteze alte pătrate.
glPushMatrix # 40; # 41; ;
// În matricea curentă, pătratul se va deplasa în stânga ecranului
glTranslatef # 40; - 2. 0. 0 # 41; ;

// Afișați pătratul multistrat în partea stângă a ecranului
glBegin # 40; GL_QUADS # 41; ;
// Acum, utilizați glMultiTextCoord2fARB f-s () în loc glTextCoord2f (),
// pentru a specifica coordonatele texturii pentru fiecare textura. Acest lucru va permite
// mutați textura noastră la coordonate complet diferite.
Un exemplu excelent al acestui lucru este umbra. glMultiTexCoord2fARB () acceptă
// ID-ul texturii pe care îl specificăm, cu coordonatele de textură dorite.
// Acum folosim aceleași coordonate pentru fiecare textură.

// Colțul din stânga sus
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; ;

// Colțul din stânga jos
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; ;

// Colțul din dreapta jos
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; ;

// Colțul din dreapta sus
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; ;
glEnd # 40; # 41; ;
// Și ieșiți din matrice astfel încât mișcarea să nu afecteze următorul pătrat.
glPopMatrix # 40; # 41; ;

// Acum scrieți al doilea exemplu de multitext în partea dreaptă a ecranului.
// Putem reassign noi texturi la GL_TEXTURE * _ARB folosite.
// Am putea folosi GL_TEXTURE2_ARB și GL_TEXTURE3_ARB, dar acest lucru nu este necesar.

// Activați primul ID și obțineți un fundal pe acesta:
glActiveTextureARB # 40; GL_TEXTURE0_ARB # 41; ;
glBindTexture # 40; GL_TEXTURE_2D. texturi # 91; 2 # 93;. texID # 41; ;

// Pe al doilea ID, vom fuma textura fumului.
glActiveTextureARB # 40; GL_TEXTURE1_ARB # 41; ;
glBindTexture # 40; GL_TEXTURE_2D. texturi # 91; 3 # 93;. texID # 41; ;

// Pentru a face fumul mai realist, faceți să înoate de fundal.
// Pentru a face acest lucru, creați un flotor static conținând numărul de mutare.
// Deoarece textura noastră este GL_WRAP, va exista un efect de continuitate.

// Creați contorul
static float wrap = 0;

// Mutați pătratul spre dreapta
glTranslatef # 40; 2. 0. 0 # 41; ;

// Și începeți să pictați
glBegin # 40; GL_QUADS # 41; ;
// Desenați vârful din stânga sus, scăzând contorul de la coordonatele texturii,
// pentru a obține efectul de defilare.
glMultiTexCoord2fARB # 40; GL_TEXTURE0_ARB. 0.0f. 1.0f # 41; ;
glMultiTexCoord2fARB # 40; GL_TEXTURE1_ARB. 0.0f - folie. 1.0f # 41; ;
glVertex3f # 40; - 1. 1. 0 # 41; ;

// Vertexul stânga inferioară
glMultiTexCoord2fARB # 40; GL_TEXTURE0_ARB. 0.0f. 0.0f # 41; ;
glMultiTexCoord2fARB # 40; GL_TEXTURE1_ARB. 0.0f - folie. 0.0f # 41; ;
glVertex3f # 40; - 1. - 1. 0 # 41; ;

// Vertexul inferior drept
glMultiTexCoord2fARB # 40; GL_TEXTURE0_ARB. 1.0f. 0.0f # 41; ;
glMultiTexCoord2fARB # 40; GL_TEXTURE1_ARB. 1.0f - înveliș. 0.0f # 41; ;
glVertex3f # 40; 1. - 1. 0 # 41; ;

// vârful din dreapta sus
glMultiTexCoord2fARB # 40; GL_TEXTURE0_ARB. 1.0f. 1.0f # 41; ;
glMultiTexCoord2fARB # 40; GL_TEXTURE1_ARB. 1.0f - înveliș. 1.0f # 41; ;
glVertex3f # 40; 1. 1. 0 # 41; ;
glEnd # 40; # 41; ;

// Măriți contorul de mișcare
înveliș + = 0,0015f;


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


Asta e tot! Pun pariu că ai crezut că ar trebui să lucrezi puțin, nu-i așa?
În viitor, puteți umbri orice suprafață, faceți un fundal mai strălucitor și multe altele
multe feluri de delicatese. Aveți nevoie de extensia EXT_texture_env_combine.
Mai multe informații despre el vor fi în lecțiile viitoare. Această extensie vă va permite
Bump mapping este foarte, foarte rapid.

PFNGLMULTITEXCOORD2FARBPROC glMultiTexCoord2fARB = NULL;
PFNGLACTIVETEXTUREARBPROC glActiveTextureARB = NULL;

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

3) Când totul este gata pentru a face, trebuie să legăm textura noastră la ID-ul multitexture.
Acest ID, putem apoi utiliza pentru a indica care multitexture special este atribuit
coordonate.

glActiveTextureARB (GL_TEXTURE0_ARB);
glEnable (GL_TEXTURE_2D);
glBindTexture (GL_TEXTURE_2D, texturi [0] .texID);

4) Acum, pentru a specifica coordonatele texturii pentru textura noastră, pur și simplu
noi trecem ID-ul multitexture de care avem nevoie.

glMultiTexCoord2fARB (GL_TEXTURE0_ARB, 0.0f, 1.0f);
glMultiTexCoord2fARB (GL_TEXTURE1_ARB, 0.0f-wrap, 1.0f);
glVertex3f (-1, 1, 0);

Asta e tot! Bucurați-vă;)







Articole similare

Trimiteți-le prietenilor: