Graphik-Programmierung mit OpenGL
Graphik-Programmierung
Anwendungsprogramm
Graphikbibliothek
Hardware
B. Preim AG Visualisierung Graphikprogrammierung
2
Inhalt
• OpenGL
• Szenengraph-APIs
B. Preim AG Visualisierung Graphikprogrammierung
3
Graphik APIs
• Low Level
– IrisGL (vorher Iris 3D API)
– OpenGL
(grundlegende Industrie-Standard 3D API für direkten
Hardware-Zugriff, entwickelt aus IrisGL)
– MesaGL
(Freeware OpenGL-Implementation, verfügbar für viele
Plattformen)
• Ziel: Abstraktion von der konkreten Graphikhardware
(Größe und Vorhandensein bestimmter Buffer,
Hardwareimplementierung bestimmter Funktionen)
B. Preim AG Visualisierung Graphikprogrammierung
4
Graphik APIs
• High Level
– Open Inventor
(sehr flexible, erweiterbare Szenengraph-API für Prototyp-Entwicklung,
relativ langsam, Interaktionsmechanismen)
– Performer
(monolithische SzenenGraph-API für High-Performance-Anwendungen)
– OpenGL Optimizer
(Kostenloses Toolkit, für CAD/CAM-Anwendungen entwickelt. Mesh
simplification, occlusion culling, picking).
– Cosmo3D
(SzenenGraph-API mit Eigenschaften von Performer und Inventor;
gedacht für VRML-Entwicklung)
– OpenGL++ (SGI, Intel, IBM)
(SzenenGraph-API, kombiniert Teile aus Optimizer, Performer und
Inventor)
B. Preim AG Visualisierung Graphikprogrammierung
5
OpenGL-Grundlagen
• Low-level Bibliothek für 2D- und 3D-Graphik
• Überlegung bei Low-Level-Bibliotheken:
– Vorrat an vordefinierten Primitiven. Open GL: relativ gering.
– Auf OpenGL aufbauende Extensions erweitern den Vorrat.
• Aufsätze: OpenInventor, Performer, GLUT, GLUBibliothek (OpenGL Utility Library)
• Hardwareunabhängig (Mindestfunktionalität auf allen
Plattformen - evtl. in Software)
• Unabhängig vom Fenstermanager (X11, Win32, Mac)
• Client-Server Unterstützung (X11)
B. Preim AG Visualisierung Graphikprogrammierung
6
OpenGL-Zustände
• OpenGL – Zustandsmaschine
• Zustände sind globale Variablen!
• Operationen aufgrund von Zustandsvariablen
interpretiert.
• Beispiele:
– Rendermodus
– Beleuchtungsmodell
– Zeichenattribute
• Setzen und löschen der Variablen:
void glEnable ( GLenum attribut );
void glDisable ( GLenum attribut );
B. Preim AG Visualisierung Graphikprogrammierung
7
OpenGL: Beispiel
Wichtige Funktionen:
• Hintergrund löschen:
glClear(GLbitfield mask);
GL_COLOR_BUFFER_BIT, GL_DEPTH_BUFFER_BIT
• Punkte definieren:
glVertex2f(GLfloat x1, GLfloat y1);
glVertex3f(GLfloat x1, GLfloat y1, GLfloat z1);
• Farbe festlegen:
glColor3f(GLfloat r, GLfloat g, GLfloat b);
B. Preim AG Visualisierung Graphikprogrammierung
8
OpenGL: Beispiel
• Objekt zeichnen:
glBegin ( GLenum
glVertex3f (
glVertex3f (
glVertex3f (
glVertex3f (
glEnd ();
GL_POLYGON );
GLfloat x1, GLfloat
GLfloat x2, GLfloat
GLfloat x3, GLfloat
GLfloat x4, GLfloat
y1,
y2,
y3,
y4,
GLfloat
GLfloat
GLfloat
GLfloat
z1
z2
z3
z4
);
);
);
);
• Andere Modi:
GL_POINTS, GL_LINES (jeweils 2 Punkte verbunden),
GL_LINE_STRIP, GL_LINE_LOOP (geschlossen),
GL_POLYGON (gefüllt)
B. Preim AG Visualisierung Graphikprogrammierung
9
OpenGL: Beispiel
Beispiel für ein Polygon:
glBegin(GL_POLYGON);
glVertex2f(-2.0,-2.0);
glVertex2f( 2.0,-2.0);
glVertex2f( 2.0, 2.0);
glVertex2f(-2.0, 2.0);
glEnd();
B. Preim AG Visualisierung Graphikprogrammierung
10
OpenGL: Zeichenmodi
Gleiche Punkte: unterschiedliche Modi
B. Preim AG Visualisierung Graphikprogrammierung
11
OpenGL: Zeichenmodi
Polygontypen:
• Triangle-Strips
– Jeder neue Eckpunkt wird
mit den beiden vorherigen
zu einem Dreieck verbunden
(n+2 Punkte: n Dreiecke).
• Quad-Strips
Quelle: Angel (2000)
– Je zwei Eckpunkte werden
mit den vorherigen zu einem
Viereck verbunden
(2n+2 Punkte: n Vierecke)
B. Preim AG Visualisierung Graphikprogrammierung
12
OpenGL: Zeichenmodi
Attribute für Linien und
Polygone zur Spezifikation
von Füllmustern und
Kantendarstellungen.
(glLineWidth, glLineStipple, …)
Quelle: Angel (2000)
Farben (Vorder- und Hintergrund)
glColor3f (1.0, 0.0, 0.0);
glClearColor (0, 0, 0);
// red
// black
B. Preim AG Visualisierung Graphikprogrammierung
13
OpenGL: Wichtige Funktionen
• Sichtbaren Bereich festlegen:
glViewport ( GLint x, GLint y, GLsizei width,
GLsizei height );
• Backface Culling:
glCullFace ( GLenum GL_FRONT );
// oder GL_BACK
// GL FRONT_AND_BACK
glEnable ( GLenum GL_CULL_FACE );
• Tiefenbuffer:
glEnable ( GLenum GL_DEPTH_TEST );
B. Preim AG Visualisierung Graphikprogrammierung
14
OpenGL: Wichtige Funktionen
Auswirkungen des Viewports:
Clippen am Viewport erforderlich.
OpenGL-Spezifikation:
– glOrtho2D (left, right, bottom, top);
Quelle: Angel (2000)
B. Preim AG Visualisierung Graphikprogrammierung
15
OpenGL: Kameras
•
•
•
•
Position (Center of Projection)
Orientierung
Sichtbereich (field of view)
Ausschnitt der Bildebene (Viewport)
gluLookAt (cop_x, cop_y, cop_z,
at_x, at_y, at_z, …);
gluPerspective (field_of_view, …),
Quelle: Angel (2000)
B. Preim AG Visualisierung Graphikprogrammierung
16
OpenGL: Kameras
Orthographische Projektionen
(Parallel)
• Quaderförmiger Sichtbereich
• OpenGL-Spezifikation:
– glOrtho (left, right,
bottom, top, near, far);
• Eigenschaften:
– Auch Objekte hinter der Kamera
können gesehen werden.
Quelle: Angel (2000)
B. Preim AG Visualisierung Graphikprogrammierung
17
OpenGL: Kameras
Perspektivische Projektion:
• Sichtbereich hat die Form eines
Pyramidenstumpfes
• OpenGL-Spezifikation:
glFrustum (xmin, xmax, ymin,
ymax, near, far);
oder über den Öffnunsgwinkel und
das Verhältnis von x- zu y-Werten:
gluPerspective (fovy, aspect,
near, far);
B. Preim AG Visualisierung Graphikprogrammierung
Quelle: Angel (2000)
18
Open GL: GLUT
•
•
•
•
•
•
•
GLUT - GL Utility Toolkit
Systemunabhängige OpenGL-Programme
Mehrere OpenGL-Fenster
Callback-Ereignisverarbeitung
Idle-Routine, Timer
Funktionen für verschiedene Objekte
Fensterverwaltung, Overlay
B. Preim AG Visualisierung Graphikprogrammierung
19
Open GL: GLUT-Beispiel
#include <GL\glut.h>
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBegin(GL_POLYGON);
glVertex2f(-0.5,-0.5); glVertex2f(-0.5, 0.5);
glVertex2f( 0.5, 0.5); glVertex2f( 0.5, 0.5);
glEnd();
glutSwapBuffers();
}
int main()
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutCreateWindow("Polygon");
glutDisplayFunc(&display);
glutMainLoop();
}
B. Preim AG Visualisierung Graphikprogrammierung
20
Open GL: GLUT-Initialisierung
• GLUT initialisieren:
void glutInit ( int* argcp, char** argv );
• Fenster initialisieren:
void glutInitWindowSize ( int width, int height);
void glutInitWindowPosition ( int x, int y );
• Graphikmodus:
void glutInitDisplayMode ( unsigned int mode );
• Mögliche Modi:
GLUT_RGBA, GLUT_RGB, GLUT_SINGLE, GLUT_DOUBLE
GLUT_ALPHA, GLUT_DEPTH, GLUT_STENCIL
B. Preim AG Visualisierung Graphikprogrammierung
21
OpenGL: Fenster-Initialisierung
• Fenster generieren:
int glutCreateWindow ( char* name );
• Fenster zerstören:
void glutDestroyWindow ( int win );
• Fenster neu zeichnen:
void glutPostRedisplay ( void );
• Bildschirmspeicher umschalten:
void glutSwapBuffers ( void );
B. Preim AG Visualisierung Graphikprogrammierung
22
OpenGL: Callback-Registrierung
• Display Callback:
void glutDisplayFunc ( void (*func)(void) );
• Tastatur Callback:
void glutKeyboardFunc ( void (*func)
(unsigned char key, int x, int y) );
• Maus Callback:
void glutMouseFunc ( void (*func)
(int button, int state, int x, int y));
• Idle Callback:
void glutIdleFunc ( void (*func)(void) );
B. Preim AG Visualisierung Graphikprogrammierung
23
OpenGL: Callback-Registrierung
• Timer Callback:
void glutTimerFunc ( unsigned int msecs,
void (*func) (int value), int value );
• Callback für Änderung der Fenstergröße:
void glutReshapeFunc ( void (*func)
(int width, int height) );
B. Preim AG Visualisierung Graphikprogrammierung
24
OpenGL: Ereignisverwaltung
B. Preim AG Visualisierung Graphikprogrammierung
25
OpenGL: GLUT-Ereignisverarbeitung
void glutMainLoop ( void );
while (1) {
if (Graphik wurde verändert) {
call DISPLAY Callback Funktion;
}
if (Fenster wurde verändert) {
call RESHAPE Callback Funktion;
}
if (Tastatur betätigt oder Maus bewegt) {
call KEYBOARD/MOUSE Callback Funktion;
}
call IDLE Callback Funktion;
}
B. Preim AG Visualisierung Graphikprogrammierung
26
OpenGL: Menüs
• Menü-Callback:
void glutCreateMenu ( void (*func), (int value));
• Menü festlegen:
void glutSetMenu ( int menu );
• Menü abfragen:
int glutGetMenu ( void );
• Menü zerstören:
void glutDestroyMenu ( int menu );
• Menüeintrag hinzufügen:
void glutAddMenuEntry ( char* name, int value);
B. Preim AG Visualisierung Graphikprogrammierung
27
OpenGL: Komplexe Objekte
• Kugel:
void glut{Solid|Wire}Sphere ( GLdouble radius,
GLint slices, GLint stacks );
• Würfel:
void glut{Solid|Wire}Cube ( GLdouble size );
• Kegel:
void glut{Solid|Wire}Cone ( GLdouble base,
GLdouble height, GLint slices,
GLint stacks );
• Torus:
void glut{Solid|Wire}Torus ( GLdouble inRadius,
GLdouble outRadius, GLint sides,
GLint rings );
B. Preim AG Visualisierung Graphikprogrammierung
28
Szenengraph-API
• Knoten, die in einer Baumstruktur verknüpft sind, beschreiben die
darzustellende Szene.
Arten von Knoten:
• Elementare Knoten:
–
–
–
–
–
–
–
Geometrie
Lichtquellen
Kamera
Attribute zu Geometrien (z.B. Farbe, Transparenz, Brechzahl)
Transformationen
Texturen (Muster, z.B. holzartige Maserungen)
Elemente zur Steuerung der Struktur/des Traversals
• Gruppenknoten
– Zusammenfassung von Geometrien und anderen Eigenschaften,
Repräsentation eines hierarchischen Modellzusammenhangs
B. Preim AG Visualisierung Graphikprogrammierung
29
Szenengraph-API
B. Preim AG Visualisierung Graphikprogrammierung
30
Szenengraph-API
• Beim Rendering:
–
–
–
–
–
Traversieren des Szenengraphen
Aufbau interner Datenstrukturen
Setzen verschiedener Modi
Transformationen (Aufbau der Transformationsmatrizen)
Rendern von Geometrie
• Abbildung der Graphikfunktionalität der Hardware
oder einer speziellen Bibliothek auf einer höheren
Ebene
B. Preim AG Visualisierung Graphikprogrammierung
31
Szenengraph-API
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
t0 als aktuelle Transformationsmatrix speichern
Gruppe g1  Status auf Stack
aktuelle Trafo mit t1 multiplizieren
Objekt o1 rendern
Gruppe g3 behandeln
aktuelle Trafo wiederherstellen
aktuelle Trafo mit t2 multiplizieren
Gruppe g2  Status auf Stack
aktuelle Trafo mit t3 multiplizieren
Objekt o2 rendern
aktuelle Trafo wiederherstellen
aktuelle Trafo mit t4 multiplizieren
Gruppe g3 behandeln
Status vom Stack (g2)
Status vom Stack (g1)
B. Preim AG Visualisierung Graphikprogrammierung
32
Zusammenfassung
• Überblick über LowLevel und HighLevel-Graphik APIs
• Fokus:
OpenGL, plattformunabhängige Low-LevelBibliothek
• GL-Funktionen: Zur Spezifikation von Graphikprimitiven (Was wird gezeichnet?) und Attributen
(Wie?) sowie der Kamera.
• High-Level-APIs basieren oft auf einem Szenengraph;
sind konsequenter objekt-orientiert.
B. Preim AG Visualisierung Graphikprogrammierung
33

PowerPoint-Präsentation