//---------------------------------------------------------------------
// Ukazkovy priklad cislo 21
// Autor: Pavel Tisnovsky
//
// Program otevre jedno hlavni okno a vykresli do nej klasicky RGB
// trojuhelnik a dalsi obrazce. Nasledne se tento trojuhelnik pomoci
// operace glCopyPixels() nakopiruje na dalsi tri mista ve framebufferu.
// Pred provedenim operaci kopirovani se zmeni transformace provadene
// s kopirovanymi pixely.
//---------------------------------------------------------------------
#include <GL/glut.h> // hlavickovy soubor funkci GLUTu a OpenGL
#define PIXMAP_WIDTH 256 // sirka kopirovane oblasti
#define PIXMAP_HEIGHT 256 // vyska kopirovane oblasti
//---------------------------------------------------------------------
// Funkce pro inicializaci vykreslovani
//---------------------------------------------------------------------
void onInit(void)
{
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // barva pozadi
}
//---------------------------------------------------------------------
// Nastaveni souradneho systemu v zavislosti na velikosti okna
//---------------------------------------------------------------------
void onResize(int w, int h) // argumenty 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 je volana pri kazdem prekresleni okna
//---------------------------------------------------------------------
void onDisplay(void)
{
int i;
glClear(GL_COLOR_BUFFER_BIT); // vymazani vsech bitovych rovin barvoveho bufferu
glBegin(GL_TRIANGLES); // vykresleni klasickeho RGB trojuhelniku
glColor3f(1.0f, 0.0f, 0.0f);
glVertex2i(0, 0);
glColor3f(0.0f, 1.0f, 0.0f);
glVertex2i(255, 0);
glColor3f(0.0f, 0.0f, 1.0f);
glVertex2i(127, 222);
glEnd();
glColor3f(1.0f, 0.0f, 0.0f); // do leveho horniho rohu kopirovane oblasti
glPointSize(10.0f); // jeste vykreslime cerveny bod o velikosti
glEnable(GL_POINT_SMOOTH); // 10 pixelu
glBegin(GL_POINTS);
glVertex2i(7, 247);
glEnd();
glColor3f(1.0,1.0,1.0); // bila barva
glBegin(GL_LINES); // vykresleni linkoveho vzorku
for (i=0; i<256; i+=15) {
glVertex2i(i, 255);
glVertex2i(0, i);
}
glEnd();
glPixelTransferf(GL_RED_BIAS, 0.5f); // posun cervene slozky - zvyrazneni
glRasterPos2i(PIXMAP_WIDTH, 0); // pozice pro prvni kopii
glCopyPixels(0, 0, PIXMAP_WIDTH, PIXMAP_HEIGHT, GL_COLOR);
glPixelTransferf(GL_RED_BIAS, -0.5f); // posun cervene slozky - utlumeni
glRasterPos2i(0, PIXMAP_HEIGHT); // pozice pro druhou kopii
glCopyPixels(0, 0, PIXMAP_WIDTH, PIXMAP_HEIGHT, GL_COLOR);
glPixelTransferf(GL_RED_BIAS, 0.0f);
glPixelTransferf(GL_RED_SCALE, 2.0f); // zmena kontrastu cervene slozky
glRasterPos2i(PIXMAP_WIDTH, PIXMAP_HEIGHT); // pozice pro treti kopii
glCopyPixels(0, 0, PIXMAP_WIDTH, PIXMAP_HEIGHT, GL_COLOR);
glFlush(); // provedeni a vykresleni vsech zmen
}
//---------------------------------------------------------------------
// Tato funkce je volana pri stlaceni ASCII klavesy
//---------------------------------------------------------------------
void onKeyboard(unsigned char key, int x, int y)
{
switch (key) {
case 27:
exit(0);
break; // pokud byla stlacena klavesa ESC, konec programu
default:
break;
}
}
//---------------------------------------------------------------------
// Hlavni funkce konzolove aplikace
//---------------------------------------------------------------------
int main(int argc, char **argv)
{
glutInit(&argc, argv); // inicializace knihovny GLUT
glutCreateWindow("Priklad na OpenGL cislo 21");// vytvoreni okna pro kresleni
glutReshapeWindow(2*PIXMAP_WIDTH, 2*PIXMAP_HEIGHT);// 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
onInit(); // inicializace vykreslovani
glutMainLoop(); // nekonecna smycka, kde se volaji zaregistrovane funkce
return 0; // navratova hodnota vracena operacnimu systemu
}
//---------------------------------------------------------------------
// Konec zdrojoveho souboru
//---------------------------------------------------------------------