<< home >>
Nesúvislé fragmenty z objavovania OS Linux
<<- ->>


  • OpenGL

OpenGL

Po 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

  • Geometrické a rastrové primitívy
  • B-splines
  • Pohľadové a modelovacie transformácie
  • Práca s farbami
  • Skryté čiary a odstránenie povrchov
  • Double buffering
  • Texture mapping
  • Antialiasing
  • Lighting
  • Atmosferické efekty
  • Priehľadnosť objektov
  • Zoznamy zobrazení

Podporné knižnice

  • GLU - komplexnejšie funkcie, definície objektov ako valec, disk, guľa, ...
  • GLUT - funkcie pre prácu s oknami, klávesnicou a myšou, definícia objektov ako kužeľ, štvorsten, ...
  • GLX - interakcia s X-Window, vzdialená interpretácia po sieti

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ý text

Globá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

gl_01


Príklad gl_02.c

gl_02


Príklad gl_03.c

gl_03


Príklad gl_04.c

gl_04


Príklad gl_05.c

gl_05


Príklad gl_06.c

gl06

gl06



<<- ->>