Graphische Programmiersysteme - Warum?
• Geräte-Unabhängigkeit
• Sprach-Unabhängigkeit
• Effizienz
• Portabilität
• Wartungsfreundlichkeit
Universität Frankfurt
Geschichte der graphischen Programmiersysteme und Standards
1976 Seillac Conference
1977 Core (ACM Siggraph)
1985 GKS (ISO 7942)
1986 X Window System (Industrie-Konsortium, MIT)
1988 GKS-3D (ISO 8805)
1989 PHIGS (ISO 9592)
1992 PHIGS+ (PHIGS plus lumiere und surfaces, ISO )
PEX (PHIGS Extensions to X, MIT)
1992 OpenGL (SGI, DEC, Intel, IBM, Microsoft)
Universität Frankfurt
OpenGL
• Industrie-Standard (Unterstützung vieler Hersteller)
• 3D Graphik
• Geräte-unabhängig
• “Low-Level” API
• Prozedural statt deskriptiv (immediate vs. retained mode)
Universität Frankfurt
Einbettung von OpenGL I
Universität Frankfurt
Application Program
IOServices
GDIOS
ServicesOpenGL
SoftwareRasterizer
Display
Einbettung von OpenGL II
Universität Frankfurt
Application Program
IOServices
GDIOS
ServicesOpenGL
HardwareDriver
Display
Rendering Pipeline
Modell-
Transformation
Modell-
TransformationModell-DBModell-DB
Beleuchtungs-
berechnung
Beleuchtungs-
berechnung
Viewing
Pipeline
Viewing
PipelineRaster-
konvertierung
Raster-
konvertierungRaster-
Ausgabe
Raster-
Ausgabe
Universität Frankfurt
OpenGL Pipeline
Universität Frankfurt
Simple#include <whateverYouNeed.h>
main() {OpenAWindowPlease(); /* OS/WM abhängig */
glClearColor(0.0, 0.0, 0.0, 0.0); /* Farbe zum Löschen des Bildspeichers/Fensters setzen */
glClear(GL_COLOR_BUFFER_BIT); /* Löschen des Bildspeichers/Fensters */
glMatrixMode (GL_PROJECTION);glLoadIdentity();glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0); /* Parallelprojektion mit Clipping-Quader setzen */
glColor3f (1.0, 1.0, 1.0); /* Farbe der Eckpunkte setzen */
glBegin(GL_POLYGON); /* Start einer Polygon-Definition */glVertex2f(-0.5, -0.5); glVertex2f(0.5, -0.5); /* Definition der Eckpunkte in 2D */glVertex2f(0.5,0.5); glVertex2f(-0.5, 0.5);glEnd(); /* Ende der Polygon-Definition */
glFlush(); /* Leeren des Befehlspuffers */
KeepTheWindowOnTheScreenForAWhile(); /* OS/WM abhängig */}
Universität Frankfurt
Simple
Universität Frankfurt
GLuint, GLenum, GLbitfieldunsigned long32-bit unsigned integerui
GLushortunsigned short16-bit unsigned integerus
GLubyte, GLbooleanunsigned char8-bit unsigned integerub
GLdouble, GLclampddouble64-bit floating-pointd
GLfloat, GLclampffloat32-bit floating-pointf
GLint, GLsizeilong32-bit integeri
GLshortshort16-bit integers
GLbytesigned char8-bit integerb
OpenGL Type DefinitionTypical Corresponding C-
Language TypeData TypeSuffix
Parallel-Projektion
Universität Frankfurt
Parallel-ProjektionView/Clipping Volume
Universität Frankfurt
Perspektivische Projektion
Universität Frankfurt
Perspektivische ProjektionView/Clipping Volume
Universität Frankfurt
GLUTOpenGL Utility Toolkit
Universität Frankfurt
• Fensterverwaltung BS (Window, Linux, Unix, ...) und WM (X, Motif...)
• Verwaltung der Eingabegeräte
Simple
#include <windows.h>#include <GL/glut.h> /* includes <gl.h>, <glu.h> */
void init(void) {glClearColor (0.0, 0.0, 0.0, 0.0);
}
void display(void){glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0, 1.0, 1.0);glMatrixMode (GL_PROJECTION);glLoadIdentity();glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);glBegin(GL_POLYGON);glVertex2f(-0.5, -0.5); glVertex2f(-0.5,0.5); glVertex2f(0.5,0.5); glVertex2f(0.5,-0.5);glEnd();glFlush();
}
Universität Frankfurt
Simple
int main (int argc, char *argv[ ] )
{
glutInit ( &argc, argv); glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); /* Setzen des GLUT-Display-Modes */glutInitWindowSize (500, 500); /* Definition der Fenstergröße */glutInitWindowPosition (100, 100); /* Position des Fensters auf dem Bildschirm */glutCreateWindow ("Simple"); /* Generiert Fenster mit angegebenen Titel */init ();glutDisplayFunc(display); /* Definiert die Display-Funktion */glutMainLoop(); /* Startet GLUT-Event-Verarbeitung */
return 0;}
Universität Frankfurt
Simple
Universität Frankfurt
SimpleVeränderung der Fenstergröße
Universität Frankfurt
Nicht ganz so Simple
#include <windows.h>#include <GL/glut.h>
...
void reshape (int w, int h){
glViewport (0, 0, (GLsizei) w, (GLsizei) h); /* ganzes Fenster sei Viewport */
glMatrixMode (GL_Projektion); /* Manipuliere Projektions-Matrix */glLoadIdentity(); /* Initialisiere Projektionsmatrix mit
Einheitsmatrix */
if (w <= h)glOrtho (-1.0, 1.0, -1.0*(GLfloat)h/(GLfloat)w, /* passe Clipping-Volume an
Fenstergröße an */1.0*(GLfloat)h/(GLfloat)w, -1.0, 1.0);
elseglOrtho (-1.0*(GLfloat)w/(GLfloat)h,1.0*(GLfloat)w/(GLfloat)h, -1.0, 1.0, -1.0, 1.0);
}
int main(int argc, char** argv){...glutReshapeFunc(reshape);...
} Universität Frankfurt
Nicht ganz so Simple
Universität Frankfurt
AnimationRotating Rectangle
Universität Frankfurt
#include <windows.h>#include <GL\glut.h>
static GLfloat spin = 0.0;
void init(){glClearColor (0.0, 0.0, 0.0, 0.0); /* Hintergrundfarbe schwarz */}
void display(){glClear (GL_COLOR_BUFFER_BIT); /* Lösche Bildspeicher */glLoadIdentity();glRotatef (spin, 0.0, 0.0, 1.0); /* Rotiere mit Winkel spin um z-Achse */glColor3f (1.0, 0.0, 0.0); /* male mit Rot */glRectf (-25.0, -25.0, 25.0, 25.0); /* Quadrat mit Kantenlänge 50 */glutSwapBuffers(); /* Swap Double-Buffer */}
AnimationRotating Rectangle
Universität Frankfurt
void spinDisplay(){spin += 2.0; /* spin = spin + 2.0 */if (spin > 360)spin -= 360;
glutPostRedisplay(); /* Zeiche Bildspeicher neu */}
void reshape (int w, int h){glViewport (0,0, (GLsizei) w, (GLsizei) h); /* Zeichne in komplettes Fenster */glMatrixMode(GL_PROJECTION);glLoadIdentity();if (w <= h)glOrtho (-50.0, 50.0, -50.0*(GLfloat)h/(GLfloat)w, /* passe Clipping-Volume an
Fenstergröße an */50.0*(GLfloat)h/(GLfloat)w, -50.0, 50.0);
elseglOrtho (-50.0*(GLfloat)w/(GLfloat)h,50.0*(GLfloat)w/(GLfloat)h, -50.0, 50.0, -50.0, 50.0);
glMatrixMode(GL_MODELVIEW);}
AnimationRotating Rectangle
Universität Frankfurt
void mouse (int button, int state, int x, int y) /* Mouse Handler */{switch (button) {case GLUT_LEFT_BUTTON:
if (state == GLUT_DOWN)glutIdleFunc (spinDisplay);
break;case GLUT_MIDDLE_BUTTON:
if (state == GLUT_DOWN)glutIdleFunc (NULL);
break;default: break;}}
AnimationRotating Rectangle
Universität Frankfurt
void keyboard (unsigned char key, int x, int y){switch (key) {case 'r': glutIdleFunc (spinDisplay);
break;case 's': glutIdleFunc (NULL);
break;default: break;
}}
AnimationRotating Rectangle
Universität Frankfurt
int main(int argc, char *argv[ ]){glutInit ( &argc, argv);glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); /* Double Buffer anfordern */glutInitWindowSize (250,250);glutInitWindowPosition (100,100);glutCreateWindow("Rotating Rectangle");init();glutDisplayFunc(display);glutReshapeFunc(reshape);glutKeyboardFunc(keyboard); /* Registriere Keyboard-Handler */glutMouseFunc(mouse); /* Registriere Mouse-Handler */glutMainLoop();return 0;}
Übungsaufgabe
Universität Frankfurt
Aufgabe 1: Schreiben Sie ein Programm, in dem sich ein Quadrat geradlinig, aber niemals horizontal oder vertikal, durch ein Fenster bewegt. Sobald es auf die Fenstergrenzen trifft, wird es an diesen reflektiert.