´ r´ı 2013, Brno 24. zaˇ ´ Pˇripravil: David Prochazka
´ ı grafickych Vykreslovan´ ´ primitiv ˇ ıtacov ˇ a´ grafika 2 Poc´
´ ı grafickych Vykreslovan´ ´ primitiv
ˇ Obsah pˇredna´ sky 1
´ ı grafick´ych primitiv Vykreslovan´
2
Nastaven´ı vzhledu bodu˚
3
Pole vrcholu˚
4
´ ı objektu˚ v pol´ıch vrcholu˚ Vykreslovan´
5
Shrnut´ı
Strana 2 / 38
´ ı grafickych Vykreslovan´ ´ primitiv
Strana 3 / 38
´ ı graf. primitiv Vykreslovan´ ´ jako skupiny vrcholu. Objekty jsou definovany ˚ V´ysledn´y tvar je ´ ˇ otazkou reprezentace techto vrcholu. ˚ 1 2 3 4 5 6 7
glBegin ( typ_primitiva ); glVertex3f (...); glVertex3f (...); glVertex3f (...); glVertex3f (...); ... glEnd ();
´ Zakladn´ ı primitiva: GL POINTS, GL LINES, GL LINE STRIP, GL LINE LOOP, GL TRIANGLES, GL TRIANGLE FAN, GL TRIANGLE STRIP, GL QUADS, GL POLYGON, GL QUAD STRIP1 .
1
od verze OpenGL 3.0 jsou tato primitiva oznaˇcena na zastarala´
´ ı grafickych Vykreslovan´ ´ primitiv
Typy grafickych ´ primitiv
Strana 4 / 38
´ ı grafickych Vykreslovan´ ´ primitiv
Strana 5 / 38
ˇ ı graficka´ primitiva Dals´ Mimo tato primitiva existuj´ı varianty se stejnolehl´ymi vrcholy: LINES ADJACENCY, LINE STRIP ADJACENCY, TRIANGLES ADJACENCY, TRIANGLE STRIP ADJACENCY.
Tento typ primitiv vyuˇz´ıvaj´ı Vertex Shadery.
´ ı grafickych Vykreslovan´ ´ primitiv
Strana 6 / 38
´ Vykreslen´ı jednobarevneho trojuheln´ ´ ıku 1 2
void display ( void ){ glClear ( G L _ C O L O R _ B U F F E R _ B I T );
3
glColor3f (1.0 , 0.0 , 0.0);
4
// definice barvy
5
// vykresluj trojuhelniky dokud nebude receno jinak glBegin ( GL_TRIANGLES ); glVertex2i (10 , 10); // definice vrcholu glVertex2i (60 , 300); glVertex2i (460 , 460); // prestan vykreslovat trojuhelniky glEnd ();
6 7 8 9 10 11 12 13
glFlush ();
14 15
}
´ ı grafickych Vykreslovan´ ´ primitiv
Strana 7 / 38
Vykreslen´ı dvou jednobarevnych ´ trojuheln´ ´ ıku˚ 1 2
void display ( void ){ glClear ( G L _ C O L O R _ B U F F E R _ B I T );
3
glColor3f (1.0 , 0.0 , 0.0);
4 5
// vykresluj trojuhelniky dokud nebude receno jinak glBegin ( GL_TRIANGLES ); glVertex2i (520 , 20); // prvni trojuhelnik glVertex2i (50 , 400); glVertex2i (600 , 460); glVertex2i (10 , 10); // druhy trojuhelnik glVertex2i (60 , 300); glVertex2i (460 , 420); // prestan vykreslovat trojuhelniky glEnd ();
6 7 8 9 10 11 12 13 14 15 16
glFlush ();
17 18
}
´ ı grafickych Vykreslovan´ ´ primitiv
Strana 8 / 38
´ Vykreslen´ı barevneho trojuheln´ ´ ıku 1 2
void display ( void ){ glClear ( G L _ C O L O R _ B U F F E R _ B I T );
3
// vykresluj trojuhelniky dokud nebude receno jinak glBegin ( GL_TRIANGLES ); glColor3f (1.0 , 0.0 , 0.0); // definice cervene barvy glVertex2i (10 , 10); // definice vrcholu glColor3f (0.0 , 1.0 , 0.0); // definice zelene barvy glVertex2i (60 , 300); glColor3f (0.0 , 0.0 , 1.0); // definice modre barvy glVertex2i (460 , 460); // prestan vykreslovat trojuhelniky glEnd ();
4 5 6 7 8 9 10 11 12 13 14
glFlush ();
15 16
}
´ ı grafickych Vykreslovan´ ´ primitiv
Strana 9 / 38
Immediate mode ´ ı objektu˚ (immediate mode) je Tento zpusob vykreslovan´ ˚ zastaral´y. V nov´ych verz´ıch OpenGL pˇrestane b´yt postupneˇ ´ podporovan. Jedna´ se o pˇr´ıkazy: glBegin a glEnd, glColor*, glSecondaryColor*, glVertex*, glIndex*, glNormal*, glTexCoord*, glFogCoord*,
´ Jedin´ym zachovavan´ ym je glVertexAttrib*.
Nastaven´ı vzhledu bodu˚
ˇ Obsah pˇredna´ sky 1
´ ı grafick´ych primitiv Vykreslovan´
2
Nastaven´ı vzhledu bodu˚
3
Pole vrcholu˚
4
´ ı objektu˚ v pol´ıch vrcholu˚ Vykreslovan´
5
Shrnut´ı
Strana 10 / 38
Nastaven´ı vzhledu bodu˚
Strana 11 / 38
Nastaven´ı vzhledu bodu˚ Velikost bodu lze nastavit pomoc´ı glPointSize(). ´ Velikost je v pixelech a nenulova. V´ychoz´ı hodnota je 1. ´ V budouc´ıch verz´ıch OpenGL jiˇz nebude podporovan pˇr´ıkaz pro vyhlazen´ı bodu – POINT SMOOTH, ani reˇzim POINT SPRITE. ´ tak, jako by byl aktivovan ´ Body budou vˇzdy vykreslovany ´ jako 2D objekt). reˇzim POINT SPRITE (bod je zobrazovan
Nastaven´ı vzhledu bodu˚
Strana 12 / 38
Nastaven´ı vzhledu lini´ı ´ sˇ ´ıˇrku – glLineWidth(). Linie muˇ ˚ ze m´ıt specifikovanu ˇ ırˇka mus´ı b´yt menˇs´ı, neˇz 1.0. S´ ´ pˇr´ıpadeˇ je generovana ´ V opaˇcnem chyba INVALID VALUE. ´ enou ˇ Dˇr´ıve uvad vlastnost´ı byl vzorek – glLineStipple() s ´ pˇr´ıluˇsn´ymi parametry a nasledn eˇ aktivovan´y pomoc´ı glBegin(GL LINE STIPPLE). Bodouc´ı verze OpenGL vˇsak s touto fukc´ı nepoˇc´ıtaj´ı.
Nastaven´ı vzhledu bodu˚
Strana 13 / 38
Nastaven´ı vzhledu polygonu˚ Kaˇzd´y polygon ma´ pˇredn´ı a zadn´ı stranu. ´ ´ V zakladn´ ım nastaven´ı jsou obeˇ strany renderovany stejn´ym zpusobem. ˚ ˇ vykreslovan´ ´ ı pouˇzijeme pˇr´ıkaz Pro zmenu glPolygonMode(). Pˇr´ıkaz ma´ dva parametry face muˇ ˚ ze m´ıt hodnotu GL FRONT, GL BACK, ´ GL FRONT AND BACK – urˇcuje, zda budou vykreslovany pouze pˇredn´ı, zadn´ı nebo obeˇ strany polygonu. mode urˇcuje zpusob za bude polygon vykreslen body, ˚ useˇ ´ ckami nebo s v´ypln´ı – GL POINT, GL LINE, GL FILL.
Nastaven´ı vzhledu bodu˚
Strana 14 / 38
Nastaven´ı vzhledu polygonu˚ (2) ˇ ı face. V budouc´ıch verz´ıch OpenGL se poˇc´ıta´ s odstranen´ ´ stejne. ˇ Obeˇ strany budou vˇzdy renderovany ´ a´ vypuˇsten´ ˇ ı pˇr´ıkazu Stejneˇ tak se pˇredpoklad glPolygonStipple().
Pole vrcholu˚
ˇ Obsah pˇredna´ sky 1
´ ı grafick´ych primitiv Vykreslovan´
2
Nastaven´ı vzhledu bodu˚
3
Pole vrcholu˚
4
´ ı objektu˚ v pol´ıch vrcholu˚ Vykreslovan´
5
Shrnut´ı
Strana 15 / 38
Pole vrcholu˚
Strana 16 / 38
´ ´ ´ Zasadn´ ı problemy ukazan ych ´ pˇr´ıkladu˚ ´ ı funkce. Kaˇzda´ definice barvy a vrcholu znamena´ volan´ ´ e´ volan´ ´ ı funkc´ı. Je nutne´ omezit neustal Je nutne´ omezit duplicitn´ı definice vrcholu˚ (jeden vrchol je ˇ ´ v ruzn´ pouˇzit nekolikr at ˚ ych objektech). ˇ s´ı se pomoc´ı display listu˚ nebo pol´ı vrcholu˚ (Vertex Reˇ Buffers).
Pole vrcholu˚
Strana 17 / 38
Vertex Buffers – pole vrcholu˚ ´ ı objektu˚ Vertex buffers pˇredstavuj´ı alternativu k definovan´ pomoc´ı samostatn´ych vrcholu. ˚ Tato metoda je rychlejˇs´ı (nen´ı nutne´ volat tolik funkc´ı) ˇ s´ı (nen´ı nutne´ duplicitneˇ definovat a prostoroveˇ usporn ejˇ ´ vrcholy). ´ nasleduj´ ´ Pro pouˇzit´ı pole vrcholu˚ je nutne´ provest ıc´ı kroky: Aktivace pole/pol´ı – kromeˇ pole vrcholu˚ lze definovat i pole ´ ıch barev, souˇradnic textur, aj. barev, sekundarn´ 2 uloˇ zen´ı dat do pol´ı pomoc´ı ukazatelu, ˚ 3 vykreslen´ı elementu ˚ definovan´ych poli. 1
Pole vrcholu˚
Strana 18 / 38
Aktivace pole Pole aktivujeme a deaktivujeme pˇr´ıkazy: glEnableClientState(GL ... ARRAY) a glDisableClientState(GL ... ARRAY). ´ K dispozici jsou nasleduj´ ıc´ı pole: GL VERTEX ARRAY – pole souˇradnic vrcholu, ˚ GL COLOR ARRAY – pole sloˇzek barev, ´ ıch barev, GL SECONDARY COLOR ARRAY – pole sekundarn´ ´ GL INDEX ARRAY – sloˇzky indexovan´ych bar. (zastarale) ´ (v´ypoˇcet osvetlen´ ˇ GL NORMAL ARRAY – hodnoty normal ı), ´ s mlhou, GL FOG COORDINATE ARRAY – pole pro praci GL TEXTURE COORD ARRAY – pole souˇradnic do textury, ´ GL EDGE FLAG ARRAY – pˇr´ıznaky pro hrany (zda je viditelna).
Pole vrcholu˚
Strana 19 / 38
Uloˇzen´ı dat o trojuheln´ ´ ıku do pole Pole aktivujeme a deaktivujeme pˇr´ıkazy: ´ dvema ˇ Za pˇredpokladu, zˇ e vrcholy trojuheln´ ıku jsou dany ´ souˇradnicemi typu GLint (x a y), bude pole: {x1 , y1 , x2 , y2 , x3 , y3 }, kde xa , ya jsou hodnoty typu GLint. V C++ to lze zapsat: GLint vertices[] = {10, 10, 100, 300, 200, 10}; ´ je nezbytne´ specifikovat strukturu pole. Dale K tomu slouˇz´ı: glVertexPointer() (definice struktury vrcholu), ˚ glColorPointer() (definice barevn´ych sloˇzek).
Pole vrcholu˚
Strana 20 / 38
Ukazatele do pole vrcholu˚ glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointers) size nab´yva´ hodnot 2, 3, 4 podle poˇctu souˇradnic vrcholu, type specifikuje typ souˇradnic pole vrcholu˚ (GL SHORT, GL INT, GL FLOAT, GL DOUBLE), ´ ˇ stride urˇcuje vzdalenost mezi dvema po sobeˇ jdouc´ımi ˇ ´ prvky v bytech (podrobneˇ zm´ıneno u prokladan´ ych pol´ı) ´ pointers obsahuje nazev pole s definic´ı vrcholu. ˚ Pˇr´ıklady: glVertexPointer(2, GL INT, 0, vertices); glVertexPointer(2, GL FLOAT, 5*sizeof(GL FLOAT), &triangle[0]);
Pole vrcholu˚
Strana 21 / 38
Ukazatele do pole barev glColorPointer(GLint size, GLenum type, GLsizei stride, cont GLvoid *pointers) Parametry maj´ı obdobn´y v´yznam jako u pole vrcholu. ˚ ´ size nab´yva´ hodnot 3 nebo 4 (bez/s alfa kanalem) ˇ e´ u pole vrcholu˚ take´ type muˇ ˚ ze m´ıt mimo hodnoty zm´ınen hodnoty GL BYTE, GL UNSIGNED BYTE, GL UNSIGNED SHORT, GL UNSIGNED INT.
´ ı objektu˚ v pol´ıch vrcholu˚ Vykreslovan´
ˇ Obsah pˇredna´ sky 1
´ ı grafick´ych primitiv Vykreslovan´
2
Nastaven´ı vzhledu bodu˚
3
Pole vrcholu˚
4
´ ı objektu˚ v pol´ıch vrcholu˚ Vykreslovan´
5
Shrnut´ı
Strana 22 / 38
´ ı objektu˚ v pol´ıch vrcholu˚ Vykreslovan´
Strana 23 / 38
ˇ s´ ˇ ı vykreslen´ı hodnot v poli Efektivnej Existuje pˇr´ıkaz glArrayElement(GLint poradi), kde ´ y vrchol ze seznamu se parametr poˇrad´ı urˇcuje o kolikat´ ´ ´ jedna (viz pˇredchazej´ıc´ı pˇr´ıklady). Tento pˇr´ıkaz tedy nahrazuje dvojci pˇr´ıkazu˚ glVertex* a ´ ı aˇz na polovinu). glColor* (sn´ızˇ ´ıme poˇcet volan´
´ ı objektu˚ v pol´ıch vrcholu˚ Vykreslovan´
Samostatna´ pole vrcholu˚ 1 2 3 4 5 6
void display ( void ){ glClear ( G L _ C O L O R _ B U F F E R _ B I T ); static GLint vertices [] = // tri dvojce souradnic {10 , 10 , 100 , 300 , 200 , 10}; static GLfloat colors [] = // tri trojce barev {1.0 , 0.0 , 0.0 , 0.0 , 0.0 , 1.0 , 0.0 , 1.0 , 0.0};
7 8 9 10 11
g l E n a b l e C l i e n t S t a t e ( G L_ VE RT E X_ AR RA Y ); g l E n a b l e C l i e n t S t a t e ( GL_COLOR _ARRAY ); g lV erte x Po in t er (2 , GL_INT , 0 , vertices ); glCo lorPoint er (3 , GL_FLOAT , 0 , colors );
12 13 14 15 16 17
glBegin ( GL_TRIANGLES ); glAr rayEleme nt (0); glAr rayEleme nt (1); glAr rayEleme nt (2); glEnd ();
18 19 20 21
g l D i s a b l e C l i e n t S t a t e ( GL _ VE RT E X_ AR RA Y ); g l D i s a b l e C l i e n t S t a t e ( G L_COLOR _ARRAY ); glFlush ();
Strana 24 / 38
´ ı objektu˚ v pol´ıch vrcholu˚ Vykreslovan´
Strana 25 / 38
Kombinovane´ pole – stride a pointers stride ma´ v pˇr´ıpadeˇ pouˇzit´ı samostatn´ych pol´ı pro vrcholy, barvy, atp. hodnotu 0. ´ kdyˇz je do jednoho pole uklad ´ ano ´ Nenulovou hodnotu ma, v´ıce ruzn´ ˚ ych definic (napˇr. barvy i souˇradnice). ´ ´ Pak je hodnota rovna vzdalenosti v bytech mezi zaˇcatky ˇ dvou po sobe jdouc´ıch hodnot. Napˇr.: pokud barvy i vrcholy jsou typu GL FLOAT, pak ´ vzdalenost bude 5*sizeof(GL FLOAT) (2 souˇradnice pro vrcholy + 3 barevne´ sloˇzky). ´ je v tomto pˇr´ıpadeˇ nutne´ posledn´ım parametrem Dale ´ pointers definovat, kde pole zaˇc´ına. ˇ zˇ e v poli jsou hodnoty uloˇzeny ve formatu ´ V pˇr´ıpade, x1 , y1 , R1 , G1 , B1 , ... bude pointers pro vrcholy &kombinovanePole[0] a pro barvy &kombinovanePole[2].
´ ı objektu˚ v pol´ıch vrcholu˚ Vykreslovan´
Strana 26 / 38
Kombinovane´ pole vrcholu˚ 1 2 3 4 5 6
void display ( void ){ glClear ( G L _ C O L O R _ B U F F E R _ B I T ); static GLfloat triangle [] = { 10.0 , 10.0 , 1.0 , 0.0 , 0.0 , // 2 sour . vrch . , 3 bar . slozky 100.0 , 300.0 , 0.0 , 0.0 , 1.0 , 200.0 , 10.0 , 0.0 , 1.0 , 0.0};
7 8 9 10 11
g l E n a b l e C l i e n t S t a t e ( G L_ VE RT E X_ AR RA Y ); g l E n a b l e C l i e n t S t a t e ( GL_COLOR _ARRAY ); g lV erte x Po in t er (2 , GL_FLOAT , 5* sizeof ( GL_FLOAT ) , & triangle [0]); glCo lorPoint er (3 , GL_FLOAT , 5* sizeof ( GL_FLOAT ) , & triangle [2]);
12 13 14 15 16 17
glBegin ( GL_TRIANGLES ); glAr rayEleme nt (0); // prikaz je popsan nize glAr rayEleme nt (1); glAr rayEleme nt (2); glEnd ();
18 19 20 21
g l D i s a b l e C l i e n t S t a t e ( GL _ VE RT E X_ AR RA Y ); g l D i s a b l e C l i e n t S t a t e ( G L_COLOR _ARRAY ); glFlush ();
´ ı objektu˚ v pol´ıch vrcholu˚ Vykreslovan´
Strana 27 / 38
´ Kritika prezentovaneho pˇr´ıstupu ´ ı objektu˚ nen´ı z hlediska Ani tento zpusob vykreslovan´ ˚ dopˇredne´ kompatibility s nov´ymi verzemi OpenGL vhodn´y, ´ pouˇz´ıvaj´ı pˇr´ıkazy glBegin(), glEnd(), ktere´ protoˇze se stale ˇ budou ze specifikace odstraneny.
´ ı objektu˚ v pol´ıch vrcholu˚ Vykreslovan´
Strana 28 / 38
Efektivn´ı vykreslen´ı vrcholu˚ glDrawElements(GLenum mode, Glsizei count, GLenum type, void* indices) ˇ ´ ´ ı. Umoˇznuje vykreslen´ı objektu pomoc´ı jedineho volan´ ´ ıc´ı se mezi glBegin(*) Nahrazuje celou strukturu nachazej´ a glEnd(). ´ mode – typ vykreslovaneho objektu (napˇr. GL TRINAGLES), count – poˇcet vrcholu, ˚ ktere´ jsou uloˇzeny v poli indexu˚ (tj. poˇcet vykreslovan´ych vrcholu), ˚ type – typ indexu˚ v poli indexu˚ (napˇr. GL INT), indices – odkaz na pole indexu. ˚ ˇ Pole indexu˚ umoˇznuje vybrat z pole vrcholu˚ seznam vrcholu, ˚ ktere´ budou vykresleny. Nejedna´ se tedy pˇr´ımo o pole vrcholu! ˚
´ ı objektu˚ v pol´ıch vrcholu˚ Vykreslovan´
Strana 29 / 38
Efektivn´ı vykreslen´ı vrcholu˚ – pˇr´ıklad 1 2 3 4 5 6
void display ( void ){ glClear ( G L _ C O L O R _ B U F F E R _ B I T ); static GLfloat triangle [] = { 10.0 , 10.0 , 1.0 , 0.0 , 0.0 , 100.0 , 300.0 , 0.0 , 0.0 , 1.0 , 200.0 , 10.0 , 0.0 , 1.0 , 0.0};
7
g l E n a b l e C l i e n t S t a t e ( G L_ VE RT E X_ AR RA Y ); g l E n a b l e C l i e n t S t a t e ( GL_COLOR _ARRAY );
8 9 10
g lV erte x Po in t er (2 , GL_FLOAT , 5* sizeof ( GL_FLOAT ) , & triangle [0]); glCo lorPoint er (3 , GL_FLOAT , 5* sizeof ( GL_FLOAT ) , & triangle [2]);
11 12 13
static GLubyte indices []={0 ,1 ,2}; // definice pole indexu glDr awElemen ts ( GL_TRIANGLES , 3 , GL_UNSIGNED_BYTE , indices );
14 15 16
g l D i s a b l e C l i e n t S t a t e ( GL _ VE RT E X_ AR RA Y ); g l D i s a b l e C l i e n t S t a t e ( G L_COLOR _ARRAY ); glFlush ();
17 18 19 20
}
´ ı objektu˚ v pol´ıch vrcholu˚ Vykreslovan´
Strana 30 / 38
ˇ ırˇen´ı glDrawElements() Rozs´ glMultiDrawElements(GLenum mode, GLsizei* count, GLenum type, void** indices, GLsizei primcount) ˇ Umoˇznuje pˇredat v´ıce pol´ı pro vykreslen´ı. 1 2 3 4 5
... static static static static
GLubyte GLubyte GLsizei GLvoid *
firstIndices [] = {0 , 1 , 2}; secondIndices [] = {2 , 4 , 8}; count [] = {3 , 3}; indices [2] = { firstIndices , secondIndices };
6 7 8 9 10 11 12 13
glMultiDrawElements ( GL_LINE_STRIP , // count , // GL_UNSIGNED_BYTE , // indices , // 2); // ...
typ vyk reslovan ych primitiv pole s pocty indexu v polich typ indexu pole s poli indexu pocet poli
´ ı objektu˚ v pol´ıch vrcholu˚ Vykreslovan´
Strana 31 / 38
ˇ ırˇen´ı glDrawElements() (2)2 Rozs´ glDrawRangeElements(GLenum mode, GLuint begin, GLuint end, GLsizei count, GLenum type, void* indices) ˇ Umoˇznuje definovat rozsah indexu˚ vrcholu, ˚ ktere´ budou pouˇzity. ˇ b´yt v rozmez´ı Vˇsechny hodnoty v poli indexu˚ by mely begin, end. ´ hranicemi, budou Hodnoty leˇz´ıc´ı v rozsahu danem ´ pro rychlejˇs´ı vykreslen´ı. optimalizovany ´ chybu (ale nemus´ı, Pokud nejsou, muˇ ˚ ze OpenGL vyhlasit ´ z´ı na implementaci). zaleˇ
2
nezkouˇs´ım
´ ı objektu˚ v pol´ıch vrcholu˚ Vykreslovan´
Strana 32 / 38
Rozsahy glDrawRangeElements()3 ´ Tento pˇr´ıkaz ma´ smysl zejmena v kombinaci s pˇr´ıkazy: glGetIntegerv(GL MAX ELEMENTS VERTICES), glGetIntegerv(GL MAX ELEMENTS INDICES).
´ maximaln´ ´ ı doporuˇcen´y poˇcet Ty jsou schopny vratit vrcholu, ˚ resp. indexu. ˚ Pokud end-start+1 > glGetIntegerv(GL MAX ELEMENTS VERTICES) 2 nebo count > glGetIntegerv(GL MAX ELEMENTS INDICES), 1
´ ı. muˇ ˚ ze doj´ıt ke sn´ızˇ en´ı v´ykonu vykreslovan´
3
nezkouˇs´ım
´ ı objektu˚ v pol´ıch vrcholu˚ Vykreslovan´
Strana 33 / 38
´ ı pol´ı Pˇr´ıme´ vykreslovan´ glDrawArrays(GLenum type, GLint first, GLsizei count), glMutiDrawArrays(GLenum type, GLint* first, GLsizei* count, GLsizei primcount) Nepracuj´ı s indexy, ale pˇr´ımo vykresluj´ı pole vrcholu. ˚ ´ Od vrcholu specifikovaneho pomoc´ı first, po vrchol first + count.
´ ı objektu˚ v pol´ıch vrcholu˚ Vykreslovan´
Strana 34 / 38
Vykreslen´ı barevnych ´ trojuheln´ ´ ıku˚ pomoc´ı funkce glDrawArrays() 1 2 3
void display ( void ){ // zde bude vymazani frame bufferu , // definice pole , zapnuti poli barev a vrcholu ...
4
g lV er t ex Po in t er (2 , GL_FLOAT , 5* sizeof ( GL_FLOAT ) , & triangles [0]); glCo lorPoint er (3 , GL_FLOAT , 5* sizeof ( GL_FLOAT ) , & triangles [2]);
5 6 7
glDrawArrays ( GL_TRIANGLES , 0 , 6);
8 9
// vypnuti poli glFlush ();
10 11 12
}
´ ı objektu˚ v pol´ıch vrcholu˚ Vykreslovan´
Strana 35 / 38
´ ı metod vykreslovan´ ´ ı Srovnan´ ´ ı prvku: Nedoporuˇcene´ metody vykreslovan´ ˚ glArrayElement – nahrazuje jen definici vrcholu. ´ ı prvku: Doporuˇcene´ metody vykreslovan´ ˚ glDrawElements – pˇreb´ıra´ indexy do pole, glMultiDrawElements – pˇreb´ıra´ v´ıce pol´ı indexu˚ do pole, glDrawRangeElements – vykresluje rozsah indexu˚ do pole, glDrawArrays – pˇreb´ıra´ pˇr´ımo pole a vykresluje rozsah, ˇ glMutiDrawArrays – pˇreb´ıra´ nekolik pol´ı, ´ glInterleavedArrays – pˇreb´ıra´ prokladan e´ pole (viz ´ dale).
Shrnut´ı
ˇ Obsah pˇredna´ sky 1
´ ı grafick´ych primitiv Vykreslovan´
2
Nastaven´ı vzhledu bodu˚
3
Pole vrcholu˚
4
´ ı objektu˚ v pol´ıch vrcholu˚ Vykreslovan´
5
Shrnut´ı
Strana 36 / 38
Shrnut´ı
Strana 37 / 38
Shrnut´ı ´ Bylo pˇredvedeno, jaka´ jsou zakladn´ ı primitiva a jejich vlastnosti. ˇ ´ ı pomoc´ı jednotliv´ych vrcholu˚ a Bylo zm´ıneno vykreslovan´ ´ metody. negativa teto ´ an´ ´ ı dat do pol´ı a Bylo doporuˇceno rˇeˇsen´ı v podobeˇ uklad ´ ´ ´ nasledne vykreslovan´ı pomoc´ı pˇr´ıkazu˚ gl*Elements a gl*Arrays. ˇ eho ´ ´ ı je pouˇzit´ı pol´ı Pokroˇcilou verz´ı zm´ınen vykreslovan´ vrcholu˚ v objektech bufferu˚ (Vertex Buffer Object), ktere´ ˇ ´ bude vysvetleno dale.
Shrnut´ı
Strana 38 / 38
´ Kontroln´ı otazky/ ukoly ´ Uloˇzte informace o vrcholech dvou cˇ tvercu˚ do pole a ´ nasledn eˇ je vykreslete. ´ pouˇz´ıt GL QUAD* nebo GL POLYGON, jak je Pokud nemate moˇzne´ je efektivneˇ vykreslit? ´ do jedineho ´ Zkuste uloˇzit informace o vrcholech a barvach pole.