<< home >> |
Nesúvislé fragmenty z objavovania OS Linux |
<<- ->> |
|
|
|
|
OpenGLPo predchádzajúcich štyroch grafických knižniciach načim uviesť prostredie OpenGL. Umožňuje vývoj 2D a 3D grafických aplikácií. OpenGL existuje pre viaceré platformy (MacOS, Solaris, Windows). V OS Linux je alternatívou Mesa3D (ak ale netrváme na OpenGL licencií a z toho vyplývajúcich technicko-právnych aspektoch, je nám to jedno). Podpora OpenGL(Mesa3D) je priamo v OS Linux.Bližšie info na domovských stránkach: http://www.opengl.org http://www.mesa3d.org OpenGL Programming Guide "The Red Book": http://fly.cc.fer.hr/~unreal/theredbook/ Možnosti OpenGL
Podporné knižnice
Použitie OpenGL#include <GL/gl.h>#include <GL/glu.h> #include <GL/glut.h> #include <GL/glx.h> $ gcc -o gl_01 gl_01.c -lglut Píšeme zdrojový textGlobálne premenné a konštanty:#define ESCAPE 27 // symbolicka ASCII konstanta klavesy Esc int window; // globalna premenna - cislo okna int Width = 640; // rozmery okna int Height = 480; GLuint base; // font Vytvoríme si niekoľko funkcií, ktoré sa viac menj budú opakovať v každom programe využívajúcom OpenGL: /*uvodna inicializacia a nastavenie vytvoreneho GLUT okna */ /* --------------------------------------------------- */ void InitGL(int Width, int Height) { glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // vymazanie obrazovky glClearDepth(1.0); // povolene cistenie Depth Buffer glDepthFunc(GL_LESS); // typ Depth testu glEnable(GL_DEPTH_TEST); // povolenie Depth testovania glShadeModel(GL_SMOOTH); // povolenie Smooth Color Shading glMatrixMode(GL_PROJECTION); //nastavenie modu matice glLoadIdentity(); // zmazanie a reset projekcnej matice BuildFont(); // volanie dalsej nasej vlastnej funkcie } /*funkcia volana po zmene rozmerov okna */ /* --------------------------------------------------- */ void ReSizeGLScene(int Width, int Height) { if (!Height) Height=1; // nulou delime az po troch litroch vodky glViewport(0, 0, Width, Height); // nastavenie rozmerov zobrazenia glMatrixMode(GL_PROJECTION); glLoadIdentity(); } /*nastavenie fontu pre vypis textu */ /* --------------------------------------------------- */ GLvoid BuildFont(GLvoid) { Display *dpy; XFontStruct *fontInfo; base=glGenLists(96); dpy=XOpenDisplay(NULL); fontInfo=XLoadQueryFont(dpy, "-adobe-helvetica-bold-r-normal--24-*-*-*-p-*-iso8859-1"); if (!fontInfo) { fontInfo=XLoadQueryFont(dpy, "fixed"); if (!fontInfo) printf("Problem pri nacitani X fontu!\n"); } glXUseXFont(fontInfo->fid, 32, 96, base); XFreeFont(dpy, fontInfo); XCloseDisplay(dpy); } /*vypis textu */ /* --------------------------------------------------- */ GLvoid PrintText(char *text) { if (!text) return; glPushAttrib(GL_LIST_BIT); glListBase(base-32); glCallLists(strlen(text), GL_UNSIGNED_BYTE, text); glPopAttrib(); } /*ak bola stlacena klavesa [ glutKeyboardFunc(); ] */ /* --------------------------------------------------- */ void KeyPressed(unsigned char key, int x, int y) { usleep(100); // trasovanie switch (key) { case 'q' : case ESCAPE : glutDestroyWindow(window); // zatvorenie okna exit(0); // koniec celeho programu break; case 'f' : glutFullScreen(); // okno na celu obrazovku break; case 'w' : glutReshapeWindow(Width, Height); // zmena velkosti okna break; default : break; } } A konečne funkcia, ktorá bude "čosi kresliť". V ďalších programoch budeme pracovať najmä s touto funkciou: /* --------------------------------------------------- */ void DrawGLScene(void) { static GLfloat x=0.0; static GLfloat y=0.0; static GLfloat poz_help=0.95; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glColor3f(0.0, 1.0, 0.0); x+=0.01; y+=0.01; glRasterPos3f(0.7*sin(x)-0.15, 0.7*cos(y), 0.0); PrintText("OpenGL"); if (poz_help>-0.95) poz_help-=0.005; glColor3f(0.5, 0.5, 0.5); glRasterPos3f(poz_help, 0.9, 0.0); PrintText("gl_01.c: Esc-koniec q-koniec f-fullscreen w-okno"); glutSwapBuffers(); // vymena bufferov (Double-Buffering) } A funkcia main(), ktorá to nejako dá dokopy: int main(int argc, char **argv) { glutInit(&argc, argv); // inicializacia GLUT glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH); // typ zobrazovacieho modu glutInitWindowSize(Width, Height); // velkost okna glutInitWindowPosition(0, 0); // pozicia okna window=glutCreateWindow("OpenGL flatulent"); // vytvorenie okna glutDisplayFunc(&DrawGLScene); // registracia kresliacej funkcie glutIdleFunc(&DrawGLScene); // registracia funkcie prekreslovania sceny glutReshapeFunc(&ReSizeGLScene); // registracia funkcie pri zmene velkosti okna glutKeyboardFunc(&KeyPressed); // registracia funkcie po stlaceni klavesy InitGL(Width, Height); glutMainLoop(); // spustenie GLUT udalostnej slucky return(0); } Vhodné je prezrieť si manuálové stránky všetkých vyššie uvedených funkcií, ako aj funkcií v nasledujúcich príkladoch gl_01 - gl_06 Príklad gl_01.c Príklad gl_02.c Príklad gl_03.c Príklad gl_04.c Príklad gl_05.c Príklad gl_06.c |
<<- ->> |
|
|