View
3
Download
0
Category
Preview:
Citation preview
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.
Recommended