Geräte-Unabhängigkeit • Sprach-Unabhängigkeit • Effizienz ...€¦ · 1992 OpenGL (SGI, DEC,...

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