..::OpenGL II - JednoduchΘ kreslenφ::..

Minule jsme si ukßzali jak nastavit aplikaci, aby v nφ bylo mo₧no pou₧φvat OpenGL. Dnes si ukß₧eme, jak pomocφ OpenGL kreslit na obrazovku. 

Vlastnφ kreslenφ m∙₧ete provßd∞t z jakΘkoli funkce, ale nejlepÜφ je asi reakce na zprßvu WM_PAINT. (Resp. OnDraw) Op∞t vßm kreslenφ vysv∞tlφm na p°φkladu s popisem.

void CSampleView::OnDraw(CDC* pDC)

{

CODoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

// TODO: add draw code for native data here

 

glClearColor(0.0f, 0.0f, 0.0f, 1.0f); /* Nastavφ barvu, kterou se sma₧e obrazovka. */

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /* Sma₧e obrazovku nastavenou barvou. */

 

glPushMatrix(); /* Vytvo°φ kopii aktußlnφ matice, kterß slou₧φ pro v²poΦty p°i zobrazovßnφ a nastavφ ji jako aktußlnφ. To spolu s funkcφ glPopMatrix volanΘ dßle ve zdrojovΘm k≤du, kterß ji sma₧e, zp∙sobuje, ₧e p°i ka₧dΘm zavolßnφ tΘto funkce je nastavenφ matice stejnΘ. Jinak, proto₧e funkce pro nastavovßnφ poΦßtku sou°adnic a jeho pootßΦenφ jsou v₧dy relativnφ k aktußlnφmu nastavenφ, by se mohlo stßt, ₧e by se nap°. poΦßtek p°i ka₧dΘm vykreslenφ posunoval stßle dßle a dßle, a₧ bychom vykreslovanΘ objekty nevid∞li. (Schvßln∞ zkuste tuto dvojici funkcφ vynechat a uvidφte co myslφm.) */

 

glTranslatef(0.0f, 0.0f, -8.0f); /* Posune poΦßtek o zadanΘ hodnoty ve sm∞ru sou°adnic x, y, z. Pozor! Tato funkce je relativnφ k aktußlnφmu poΦßtku. Parametry jsou: posun v ose x, posun v ose y, posun v ose z v tomto po°adφ. Orietnace os jsou: x je kladnß doprava, y kladnß nahoru, z kladnß sm∞rem ven z obrazovky. Tato funkce nemß vliv na ji₧ nakreslenΘ objekty.*/

glRotatef(45.0f, 1.0f, 0.0f, 0.0f);

glRotatef(45.0f, 0.0f, 1.0f, 0.0f);

glRotatef(10.0f, 0.0f, 0.0f, 1.0f); /* OtoΦφ sou°adnicov² systΘm okolo osy odpovφdajφcφ poslednφm t°em parametr∙m (x,y,z) o ·hel ve stupnφch zadan² prvnφm parametrem. Pozor! Tato funkce je relativnφ k aktußlnφmu natoΦenφ. Nemß vliv na ji₧ nakreslenΘ objekty. OtßΦφ se okolo aktußlnφho poΦßtku. V tomto p°φpad∞ je volßna t°ikrßt a to pro natoΦenφ o 45 stup≥∙ okolo osy x, 45 stup≥∙ okolo osy y a 10 stup≥∙ okolo osy z. */

 

glBegin(GL_QUADS); /* Udßvß, ₧e zaΦφnßme kreslit. Parametr °φkß co kreslφme a podle n∞j potΘ musφme zadat odpovφdajφcφ poΦet bod∙ pomocφ funkce glVertex3f. N∞kterΘ z mo₧n²ch parametr∙ jsou tyto: GL_POINTS - body, GL_LINES - Φßry, GL_TRIANGLES - troj·helnφkovΘ plochy, GL_QUADS - Φty°·helnφkovΘ plochy, GL_POLYGON - n·helnφkovß plocha. V tomto p°φpad∞ vykreslujeme Φty°·helnφkovou plochu (Φtverec). */

glColor3f(1.0f, 0.0f, 0.0f); /* Nastavφ barvu pro dan² bod jako intenzitu (0-1) RGB slo₧ky. Pokud mß ka₧d² bod jinou barvu, vytvo°φ pixely mezi nimi p°echod mezi t∞mito barvami. */

glVertex3f(-1.0f, 1.0f, 0.0f); /* Zadß sou°adnice prvnφho bodu Φtverce. */

 

glColor3f(0.0f, 1.0f, 0.0f);

glVertex3f(1.0f, 1.0f, 0.0f); /* 2. bod */

 

glColor3f(0.0f, 0.0f, 1.0f);

glVertex3f(1.0f, -1.0f, 0.0f); /* 3. bod */

 

glColor3f(1.0f, 1.0f, 1.0f);

glVertex3f(-1.0f, -1.0f, 0.0f); /* 4. bod */

glEnd(); /* ╪φkß, ₧e jsme skonΦili kreslenφ danΘho tvaru.*/

 

 

glBegin(GL_QUADS); /* Vykreslenφ druhΘho Φtverce.*/

glColor3f(0.0f, 1.0f, 0.0f);

glVertex3f(1.0f, 1.0f, 0.0f);

 

glColor3f(0.0f, 0.0f, 1.0f);

glVertex3f(1.0f, -1.0f, 0.0f);

 

glColor3f(1.0f, 0.0f, 0.0f);

glVertex3f(1.0f, -1.0f, -2.0f);

 

glColor3f(1.0f, 1.0f, 1.0f);

glVertex3f(1.0f, 1.0f, -2.0f);

glEnd();

 

glPopMatrix(); /* Sma₧e aktußlnφ matici pou₧itou k v²poΦt∙m p°i vykreslovßnφ. Vφce viz. popis funkce glPushMatrix. */

 

glFinish(); /* PoΦkß na dokonΦenφ vÜech d°φve volan²ch OpenGL funkcφ. */

SwapBuffers(wglGetCurrentDC()); /* Prohodφ zobrazovacφ buffery. Je to API funkce. Funkce volanß jako parametr zjistφ HDC k n∞mu₧ je OpenGL aktußln∞ p°ipojeno. */

}

 

Teto ukßzkov² zdrojov² k≤d vßm vykreslφ dv∞ strany krychle, natoΦenΘ tak aby byly ob∞ vid∞t.

A to je pro dneÜek vÜe.