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.