pas cu pas Peisaj

Acest program de instruire se referă la elementele de bază ale tehnicilor de creare a peisajului. Mă voi uita la o hartă înălțime, un algoritm de vizualizare simplu, colorat (texturare) peisaj, precum și optimizarea la nivel OpenGL. Ca de exemplu, eu cred că, dacă exemplul dimensiunea (nu inclusiv OpenGL inițializarea, etc.) mai mult de 8-10 kb, care este orice, dar nu un exemplu. Așa că am încercat să urmeze acest principiu.

Prezentarea peisajului, hartă elevație.

Pentru reprezentarea peisajului, vom folosi o hartă înălțime.

Heights Map - este o matrice bidimensională a elevație valori teren, combinate cu un anumit interval. Ie ne fiecare valoare discretă a X și Y în planul orizontal de a găsi înălțime.


O reprezentare grafică a șirului

Presupunem că în exemplele zonele luminoase reprezintă elevație, respectiv, de culoare închisă - de câmpie.

Deci, să începem. După cum se știe, orice suprafață poate fi corect reprezentate cu precizie prin triunghiuri. Prin urmare, orice patru puncte adiacente ale hărții înălțimii unui anumit dreptunghi, pe care ne-am împărțit în două triunghiuri și remiză.

În exemplul peisajului terenului implementat ca o clasă. Fragmentul de cod de mai sus de mai jos - o parte a funcției de teren :: RenderLandscape () indică cea mai simplă punerea în aplicare a procedurii de desen.

Colorat (texturare) peisaj.

Voi vorbi despre două moduri de a umple peisajul (și, în al doilea caz, texturare). Aceasta este o foarte scurtă explicație care nu afectează multe aspecte, cum ar fi multi-texturare, amestecare, texturi multiple, etc. Toate acestea voi scrie un articol separat.

Metoda una - interpolare de culori.

Prima metodă este colorat peisajul este de a utiliza interpolarea culorilor. Care este interpolarea de culoare, probabil, toată lumea știe, dar dacă cineva nu știe, un scurt exemplu. De exemplu, în cazul în desen un triunghi, fiecare nod seta o culoare diferită, vom obține imaginea prezentată mai jos. În acest caz, OpenGL se efectua interpolare dintre noi pur și simplu doriți să activați interpolare, care este simplu:

de mai jos este codul de desen demonstrează un triunghi cu culori interpolate:

Dar să revenim la peisaj. Pentru colorare, avem nevoie din nou o hartă, eu o numesc cartela de culoare. Datele pentru hărți de culoare sunt fișiere grafice în felul următor:

pas cu pas Peisaj

Aproximativ vorbind, orice imagine RGB salvat ca Raw-fișier care poate fi folosit ca o hartă de culoare. Este important de notat faptul că lățimea și înălțimea acestor fișiere trebuie să fie egală cu dimensiunea hărții înălțime!

Așa cum este cunoscut în modul RGB, un punct de imagine este descrisă de trei octeți - valoarea componentelor de culoare roșu, verde, albastru. În același fel punctul de imagine stocate în Raw-fișier.

Magazin harta de culori (precum și o hartă înălțime) va fi în matrice, un singur element de înălțime harta matrice corespunde o valoare a înălțimii, și hartă culori trei valori - intensitatea componentelor de culoare roșu, verde și albastru. Prin urmare, vom introduce următoarea structură, care va face parte dintr-o serie de culori:

În această procedură de desen (am scos pictura „sârmă“ model) a suferit modificări minore:

pas cu pas Peisaj

Metoda a doua - texturare.

Esența celei de a doua metodă este aplicată texturii terenului. Pentru aceasta avem nevoie de o textură, la fel ca și fișierul pentru cartela de culoare, trebuie doar să-l salvați ca fișier TGA este necesar (este clar că alegerea formatului - o chestiune de gust, dar TGA-fișierele utilizate în exemple de mine). Presupun că sunteți familiarizați cu texturare, și nu voi descrie cum se descarcă și de a crea o textură în OpenGL.

dimensiunea textura să nu se potrivească cu dimensiunea hărții înălțime. De exemplu, pentru 128x128 hartă elevație poate fi selectată dimensiune textură 64x64 sau 512x512 pixeli. În acest din urmă caz, calitatea bude mai bine. În practică, este suficient pentru a alege dimensiunea textura egală cu dimensiunea hărții înălțime.

Metoda constă în texturarea o textură a tuturor triunghiurilor peisajului nostru, numărând fiecare triunghi care corespunde coordonatele texturii.

Deci, înainte de a începe texturare, avem nevoie pentru a defini o schimbare pas în coordonate de textură. Este necesar să se calculeze valoarea de 1,0 / MapSize (MapSize - dimensiune înălțime hartă). Și apoi înmulțirea coordonatele x și y ale triunghiului de a face acest pas, vom obține coordonatele texturii corespunzătoare acestui triunghi. Mai jos este o diagramă care ilustrează procedurile de texturare, desen și exemplu.

Dacă doriți textura nu este „întins“ la întregul peisaj, și să îndeplinească anumite o parte din ea, este necesar pentru calcularea pitch, mai degrabă decât 1 pentru a înlocui numărul dorit, iar textura se repetă un număr predeterminat de ori.

schimbare Etapa coordonatelor textura este declarată ca o constantă în Terrain.H.

const GLfloat TextureBit = 1.0f / (float) MapSize;
și a schimbat procedura de desen este după cum urmează:

pas cu pas Peisaj

Este necesar să spun câteva cuvinte despre filtrare textura. In exemplul de mai sus utilizează un liniar de filtrare vizualizarea nama, este cea mai bună opțiune. Filtrarea cel mai apropiat vecin (GL_NEAREST) ​​degradează grav, în timp ce mipmapping aproape nu sa îmbunătățit. Utilizarea Mipmapping ar avea sens, dacă textura este mai mare decât dimensiunea peisajului cel puțin de două ori, sau în cazul în care textura se repetă.

Optimizarea nivelului OpenGL.

Imediat trebuie remarcat faptul că doar OpenGL nivel de optimizare nu poate rezolva problema performanței în ansamblu. Desigur, câștigul de performanță nu este întotdeauna suficientă. optimizare OpenGL trebuie să fie utilizat împreună cu un algoritm optim pentru cartografierea peisajului. Deși, în cazul în care cartela nu depășește 128x128, puteți face optimizare doar la nivel OpenGL.

În primul rând. ce se poate face la nivelul OpenGL, este de a reduce numărul de noduri multiple transmise conductei texturare, este necesar să se înlocuiască desenul folosind un GL_TRIANGLE_STRIP GL_TRIANGLE_FAN echivalent, așa cum se arată mai jos:

Adevărat, în exemplul anterior am folosit GL_TRINGLE_STRIP

În al doilea rând. utilizat pentru afișarea funcției glDrawElements. Această caracteristică vă permite să facă un set de primitive apelând o singură funcție, reducând astfel numărul de apeluri de funcții OpenGL. Pentru a efectua desen cu glDrawElements caracteristică, trebuie să efectuați trei pași:

1. Activați matrice cu date, în acest caz, o serie de vârfuri și coordonatele de textură (în mod similar, puteți face cu culori, normalele și alte atribute). Pentru a face acest lucru, utilizați funcția void glEnableClientState (GLenum Array), în cazul în care ca un parametru pentru a specifica GL_VERTEX_ARRAY, și apoi GL_TEXTURE_COORD_ARRAY.

2. Setați parametrii și Vectorii de date pentru stocare. Pentru a defini tipuri de matrice și servește funcția de vârfuri

În mod similar, putem defini o serie de coordonate de textură folosind comanda

anula glTexCoordPointer (Dimensiune licărire, GLenum tip, GLsizei Stride);

3. Completați matrice de date și de a efectua redare. După cum sa menționat deja, desenul se fac prin utilizarea

Mod - Specifică ce entitate va fi tras, în acest caz GL_TRIANGLE_STRIP (în principiu, poate fi orice alta). Count - numărul de primitivelor. Tip - tipul de valori ale indicilor, pot fi GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT sau GL_UNSIGNED_INT. Indici Indicii de matrice sunt stocate, conform căruia datele vor fi extrase din matrice nodurilor și coordonatele texturii.