33
Graphik-Programmierung mit OpenGL

Graphik-Programmierung mit OpenGL. B. Preim AG Visualisierung Graphikprogrammierung2 Hardware Graphikbibliothek Anwendungsprogramm Graphik-Programmierung

Embed Size (px)

Citation preview

Page 1: Graphik-Programmierung mit OpenGL. B. Preim AG Visualisierung Graphikprogrammierung2 Hardware Graphikbibliothek Anwendungsprogramm Graphik-Programmierung

Graphik-Programmierung mit OpenGL

Page 2: Graphik-Programmierung mit OpenGL. B. Preim AG Visualisierung Graphikprogrammierung2 Hardware Graphikbibliothek Anwendungsprogramm Graphik-Programmierung

B. Preim AG Visualisierung Graphikprogrammierung 2

Hardware

Graphikbibliothek

Anwendungsprogramm

Graphik-Programmierung

Page 3: Graphik-Programmierung mit OpenGL. B. Preim AG Visualisierung Graphikprogrammierung2 Hardware Graphikbibliothek Anwendungsprogramm Graphik-Programmierung

B. Preim AG Visualisierung Graphikprogrammierung 3

Inhalt

• OpenGL• Szenengraph-APIs

Page 4: Graphik-Programmierung mit OpenGL. B. Preim AG Visualisierung Graphikprogrammierung2 Hardware Graphikbibliothek Anwendungsprogramm Graphik-Programmierung

B. Preim AG Visualisierung Graphikprogrammierung 4

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)

Page 5: Graphik-Programmierung mit OpenGL. B. Preim AG Visualisierung Graphikprogrammierung2 Hardware Graphikbibliothek Anwendungsprogramm Graphik-Programmierung

B. Preim AG Visualisierung Graphikprogrammierung 5

• 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)

Graphik APIs

Page 6: Graphik-Programmierung mit OpenGL. B. Preim AG Visualisierung Graphikprogrammierung2 Hardware Graphikbibliothek Anwendungsprogramm Graphik-Programmierung

B. Preim AG Visualisierung Graphikprogrammierung 6

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, GLU-

Bibliothek (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)

Page 7: Graphik-Programmierung mit OpenGL. B. Preim AG Visualisierung Graphikprogrammierung2 Hardware Graphikbibliothek Anwendungsprogramm Graphik-Programmierung

B. Preim AG Visualisierung Graphikprogrammierung 7

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 );

Page 8: Graphik-Programmierung mit OpenGL. B. Preim AG Visualisierung Graphikprogrammierung2 Hardware Graphikbibliothek Anwendungsprogramm Graphik-Programmierung

B. Preim AG Visualisierung Graphikprogrammierung 8

OpenGL: BeispielWichtige 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);

Page 9: Graphik-Programmierung mit OpenGL. B. Preim AG Visualisierung Graphikprogrammierung2 Hardware Graphikbibliothek Anwendungsprogramm Graphik-Programmierung

B. Preim AG Visualisierung Graphikprogrammierung 9

• Objekt zeichnen:glBegin ( GLenum GL_POLYGON );

glVertex3f ( GLfloat x1, GLfloat y1, GLfloat z1 );glVertex3f ( GLfloat x2, GLfloat y2, GLfloat z2 );glVertex3f ( GLfloat x3, GLfloat y3, GLfloat z3 );glVertex3f ( GLfloat x4, GLfloat y4, GLfloat z4 );

glEnd ();

• Andere Modi:GL_POINTS, GL_LINES (jeweils 2 Punkte verbunden),GL_LINE_STRIP, GL_LINE_LOOP (geschlossen),GL_POLYGON (gefüllt)

OpenGL: Beispiel

Page 10: Graphik-Programmierung mit OpenGL. B. Preim AG Visualisierung Graphikprogrammierung2 Hardware Graphikbibliothek Anwendungsprogramm Graphik-Programmierung

B. Preim AG Visualisierung Graphikprogrammierung 10

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();

OpenGL: Beispiel

Page 11: Graphik-Programmierung mit OpenGL. B. Preim AG Visualisierung Graphikprogrammierung2 Hardware Graphikbibliothek Anwendungsprogramm Graphik-Programmierung

B. Preim AG Visualisierung Graphikprogrammierung 11

OpenGL: ZeichenmodiGleiche Punkte: unterschiedliche Modi

Page 12: Graphik-Programmierung mit OpenGL. B. Preim AG Visualisierung Graphikprogrammierung2 Hardware Graphikbibliothek Anwendungsprogramm Graphik-Programmierung

B. Preim AG Visualisierung Graphikprogrammierung 12

Polygontypen:• Triangle-Strips

– Jeder neue Eckpunkt wird mit den beiden vorherigen zu einem Dreieck verbunden (n+2 Punkte: n Dreiecke).

• Quad-Strips– Je zwei Eckpunkte werden

mit den vorherigen zu einem Viereck verbunden (2n+2 Punkte: n Vierecke)

OpenGL: Zeichenmodi

Quelle: Angel (2000)

Page 13: Graphik-Programmierung mit OpenGL. B. Preim AG Visualisierung Graphikprogrammierung2 Hardware Graphikbibliothek Anwendungsprogramm Graphik-Programmierung

B. Preim AG Visualisierung Graphikprogrammierung 13

Attribute für Linien undPolygone zur Spezifikationvon Füllmustern und Kantendarstellungen.(glLineWidth, glLineStipple, …)

Farben (Vorder- und Hintergrund)

glColor3f (1.0, 0.0, 0.0); // redglClearColor (0, 0, 0); // black

OpenGL: Zeichenmodi

Quelle: Angel (2000)

Page 14: Graphik-Programmierung mit OpenGL. B. Preim AG Visualisierung Graphikprogrammierung2 Hardware Graphikbibliothek Anwendungsprogramm Graphik-Programmierung

B. Preim AG Visualisierung Graphikprogrammierung 14

• 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 );

OpenGL: Wichtige Funktionen

Page 15: Graphik-Programmierung mit OpenGL. B. Preim AG Visualisierung Graphikprogrammierung2 Hardware Graphikbibliothek Anwendungsprogramm Graphik-Programmierung

B. Preim AG Visualisierung Graphikprogrammierung 15

Auswirkungen des Viewports:Clippen am Viewport erforderlich.OpenGL-Spezifikation:– glOrtho2D (left, right, bottom, top);

OpenGL: Wichtige Funktionen

Quelle: Angel (2000)

Page 16: Graphik-Programmierung mit OpenGL. B. Preim AG Visualisierung Graphikprogrammierung2 Hardware Graphikbibliothek Anwendungsprogramm Graphik-Programmierung

B. Preim AG Visualisierung Graphikprogrammierung 16

• 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, …),

OpenGL: Kameras

Quelle: Angel (2000)

Page 17: Graphik-Programmierung mit OpenGL. B. Preim AG Visualisierung Graphikprogrammierung2 Hardware Graphikbibliothek Anwendungsprogramm Graphik-Programmierung

B. Preim AG Visualisierung Graphikprogrammierung 17

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.

OpenGL: Kameras

Quelle: Angel (2000)

Page 18: Graphik-Programmierung mit OpenGL. B. Preim AG Visualisierung Graphikprogrammierung2 Hardware Graphikbibliothek Anwendungsprogramm Graphik-Programmierung

B. Preim AG Visualisierung Graphikprogrammierung 18

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);

OpenGL: Kameras

Quelle: Angel (2000)

Page 19: Graphik-Programmierung mit OpenGL. B. Preim AG Visualisierung Graphikprogrammierung2 Hardware Graphikbibliothek Anwendungsprogramm Graphik-Programmierung

B. Preim AG Visualisierung Graphikprogrammierung 19

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

Page 20: Graphik-Programmierung mit OpenGL. B. Preim AG Visualisierung Graphikprogrammierung2 Hardware Graphikbibliothek Anwendungsprogramm Graphik-Programmierung

B. Preim AG Visualisierung Graphikprogrammierung 20

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();

}

Page 21: Graphik-Programmierung mit OpenGL. B. Preim AG Visualisierung Graphikprogrammierung2 Hardware Graphikbibliothek Anwendungsprogramm Graphik-Programmierung

B. Preim AG Visualisierung Graphikprogrammierung 21

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_DOUBLEGLUT_ALPHA, GLUT_DEPTH, GLUT_STENCIL

Page 22: Graphik-Programmierung mit OpenGL. B. Preim AG Visualisierung Graphikprogrammierung2 Hardware Graphikbibliothek Anwendungsprogramm Graphik-Programmierung

B. Preim AG Visualisierung Graphikprogrammierung 22

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 );

Page 23: Graphik-Programmierung mit OpenGL. B. Preim AG Visualisierung Graphikprogrammierung2 Hardware Graphikbibliothek Anwendungsprogramm Graphik-Programmierung

B. Preim AG Visualisierung Graphikprogrammierung 23

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) );

Page 24: Graphik-Programmierung mit OpenGL. B. Preim AG Visualisierung Graphikprogrammierung2 Hardware Graphikbibliothek Anwendungsprogramm Graphik-Programmierung

B. Preim AG Visualisierung Graphikprogrammierung 24

• 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) );

OpenGL: Callback-Registrierung

Page 25: Graphik-Programmierung mit OpenGL. B. Preim AG Visualisierung Graphikprogrammierung2 Hardware Graphikbibliothek Anwendungsprogramm Graphik-Programmierung

B. Preim AG Visualisierung Graphikprogrammierung 25

OpenGL: Ereignisverwaltung

Page 26: Graphik-Programmierung mit OpenGL. B. Preim AG Visualisierung Graphikprogrammierung2 Hardware Graphikbibliothek Anwendungsprogramm Graphik-Programmierung

B. Preim AG Visualisierung Graphikprogrammierung 26

OpenGL: GLUT-Ereignisverarbeitungvoid 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;

}

Page 27: Graphik-Programmierung mit OpenGL. B. Preim AG Visualisierung Graphikprogrammierung2 Hardware Graphikbibliothek Anwendungsprogramm Graphik-Programmierung

B. Preim AG Visualisierung Graphikprogrammierung 27

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);

Page 28: Graphik-Programmierung mit OpenGL. B. Preim AG Visualisierung Graphikprogrammierung2 Hardware Graphikbibliothek Anwendungsprogramm Graphik-Programmierung

B. Preim AG Visualisierung Graphikprogrammierung 28

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 );

Page 29: Graphik-Programmierung mit OpenGL. B. Preim AG Visualisierung Graphikprogrammierung2 Hardware Graphikbibliothek Anwendungsprogramm Graphik-Programmierung

B. Preim AG Visualisierung Graphikprogrammierung 29

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

Page 30: Graphik-Programmierung mit OpenGL. B. Preim AG Visualisierung Graphikprogrammierung2 Hardware Graphikbibliothek Anwendungsprogramm Graphik-Programmierung

B. Preim AG Visualisierung Graphikprogrammierung 30

Szenengraph-API

Page 31: Graphik-Programmierung mit OpenGL. B. Preim AG Visualisierung Graphikprogrammierung2 Hardware Graphikbibliothek Anwendungsprogramm Graphik-Programmierung

B. Preim AG Visualisierung Graphikprogrammierung 31

• 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

Szenengraph-API

Page 32: Graphik-Programmierung mit OpenGL. B. Preim AG Visualisierung Graphikprogrammierung2 Hardware Graphikbibliothek Anwendungsprogramm Graphik-Programmierung

B. Preim AG Visualisierung Graphikprogrammierung 32

• 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)

Szenengraph-API

Page 33: Graphik-Programmierung mit OpenGL. B. Preim AG Visualisierung Graphikprogrammierung2 Hardware Graphikbibliothek Anwendungsprogramm Graphik-Programmierung

B. Preim AG Visualisierung Graphikprogrammierung 33

Zusammenfassung• Überblick über LowLevel und HighLevel-Graphik

APIs• Fokus: OpenGL, plattformunabhängige Low-

Level- Bibliothek• GL-Funktionen: Zur Spezifikation von Graphik-

primitiven (Was wird gezeichnet?) und Attributen (Wie?) sowie der Kamera.

• High-Level-APIs basieren oft auf einem Szenengraph; sind konsequenter objekt-orientiert.