//--------------------------------------------------------------------- // Ukazkovy priklad cislo 5 // Autor: Pavel Tisnovsky // // Program otevre jedno hlavni okno a vykresli nekolik trojuhelniku, // ktere maji nastaveny ruzne vlastnosti. Okno (a tim i celou aplikaci) // lze ukoncit stiskem klavesy ESC nebo uzavrenim hlavniho okna programu. //--------------------------------------------------------------------- #include <GL/glut.h> // hlavickovy soubor funkci GLUTu a OpenGL //--------------------------------------------------------------------- // Nastaveni souradneho systemu v zavislosti na velikosti okna //--------------------------------------------------------------------- void onResize(int w, int h) // parametry w a h reprezentuji novou velikost okna { glViewport(0, 0, w, h); // viditelna oblast pres cele okno glMatrixMode(GL_PROJECTION); // zacatek modifikace projekcni matice glLoadIdentity(); // vymazani projekcni matice (=identita) glOrtho(0, w, 0, h, -1, 1); // mapovani abstraktnich souradnic do souradnic okna } //--------------------------------------------------------------------- // Tato funkce slouzi k vykresleni RGB trojuhelniku na pozici x, y //--------------------------------------------------------------------- void drawTriangle(GLint x, GLint y) { glBegin(GL_TRIANGLES); glColor3f(1.0f, 0.0f, 0.0f); // kazdy vertex bude vykresleny jinou barvou glVertex2i(x, y); glColor3f(0.0f, 1.0f, 0.0f); glVertex2i(x+100, y); glColor3f(0.0f, 0.0f, 1.0f); glVertex2i(x+50, y+80); glEnd(); } //--------------------------------------------------------------------- // Tato funkce je volana pri kazdem prekresleni okna // Po zavolani teto funkce se vykresli nekolik trojuhelniku s ruznymi // vlastnostmi //--------------------------------------------------------------------- void onDisplay(void) { GLubyte pattern1[32*4]={ // prvni vyplnovy vzorek 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x01, 0xC0, 0x06, 0xC0, 0x03, 0x60, 0x04, 0x60, 0x06, 0x20, 0x04, 0x30, 0x0C, 0x20, 0x04, 0x18, 0x18, 0x20, 0x04, 0x0C, 0x30, 0x20, 0x04, 0x06, 0x60, 0x20, 0x44, 0x03, 0xC0, 0x22, 0x44, 0x01, 0x80, 0x22, 0x44, 0x01, 0x80, 0x22, 0x44, 0x01, 0x80, 0x22, 0x44, 0x01, 0x80, 0x22, 0x44, 0x01, 0x80, 0x22, 0x44, 0x01, 0x80, 0x22, 0x66, 0x01, 0x80, 0x66, 0x33, 0x01, 0x80, 0xCC, 0x19, 0x81, 0x81, 0x98, 0x0C, 0xC1, 0x83, 0x30, 0x07, 0xe1, 0x87, 0xe0, 0x03, 0x3f, 0xfc, 0xc0, 0x03, 0x31, 0x8c, 0xc0, 0x03, 0x33, 0xcc, 0xc0, 0x06, 0x64, 0x26, 0x60, 0x0c, 0xcc, 0x33, 0x30, 0x18, 0xcc, 0x33, 0x18, 0x10, 0xc4, 0x23, 0x08, 0x10, 0x63, 0xC6, 0x08, 0x10, 0x30, 0x0c, 0x08, 0x10, 0x18, 0x18, 0x08, 0x10, 0x00, 0x00, 0x08}; GLubyte pattern2[32*4]={ // druhy vyplnovy vzorek 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa}; glClearColor(0.0, 0.0, 0.0, 0.0); // nastaveni mazaci barvy na cernou glClear(GL_COLOR_BUFFER_BIT); // vymazani bitovych rovin barvoveho bufferu glPointSize(5.0f); // velikost bodu je rovna peti pixelum glLineWidth(2.0f); // tloustka usecek je rovna dvema pixelum glEnable(GL_POINT_SMOOTH); // povoleni antialiasingu bodu glEnable(GL_LINE_SMOOTH); // povoleni antialiasingu usecek glDisable(GL_POLYGON_STIPPLE); // zakazat vzorek glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); // vykreslovani vyplnenych trojuhelniku drawTriangle(50, 50); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); // vykreslovani pouze hran trojuhelniku drawTriangle(180, 50); glPolygonMode(GL_FRONT_AND_BACK, GL_POINT); // vykreslovani pouze vrcholu trojuhelniku drawTriangle(310, 50); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); // vykreslovani vyplnenych trojuhelniku glEnable(GL_POLYGON_STIPPLE); // povolit vzorek glPolygonStipple(pattern1); // zadat prvni vzorek drawTriangle(110, 190); glPolygonStipple(pattern2); // zadat druhy vzorek drawTriangle(240, 190); glFlush(); // provedeni a vykresleni zmen } //--------------------------------------------------------------------- // Tato funkce je volana pri stlaceni ASCII klavesy //--------------------------------------------------------------------- void onKeyboard(unsigned char key, int x, int y) { if (key==27) exit(0); // pokud byla stlacena klavesa ESC, konec programu } //--------------------------------------------------------------------- // Hlavni funkce konzolove aplikace //--------------------------------------------------------------------- int main(int argc, char **argv) { glutInit(&argc, argv); // inicializace knihovny GLUT glutCreateWindow("Priklad na OpenGL cislo 5");// vytvoreni okna pro kresleni glutReshapeWindow(450, 300); // zmena velikosti okna glutPositionWindow(100, 100); // pozice leveho horniho rohu okna glutDisplayFunc(onDisplay); // registrace funkce volane pri prekreslovani okna glutReshapeFunc(onResize); // registrace funkce volane pri zmene velikosti okna glutKeyboardFunc(onKeyboard); // registrace funkce volani pri stlaceni klavesy glutMainLoop(); // nekonecna smycka, kde se volaji zaregistrovane funkce return 0; // navratova hodnota vracena operacnimu systemu } //--------------------------------------------------------------------- // Konec zdrojoveho souboru //---------------------------------------------------------------------