CGSG/Workshop
OpenGL (Open Graphics Library) ist eine Spezifikation für ein plattform- und programmiersprachenunabhängiges API (Application Programming Interface) zur Entwicklung von 3D-Computergrafik. Der OpenGL-Standard beschreibt etwa 250 Befehle, die die Darstellung komplexer 3D-Szenen in Echtzeit erlauben. --Wikipedia
Aktuell
Wiederholung der Einführungsworkshops von kyrah Anfang 2010.
Bitte unverbindlich eintragen, wer daran interessiert wäre:
- michael
- geo
- Pepi
- georg k.
- alpi
- Olaf
- jürgen
- cypher
- tkolar
- Phantasus
- oib
- skrach
- queltos
- ra
- amir
- Bountin
- steffi
- ylem235
- Sekhmet
- xcode
- snaut
- Damian
- your name here
Unterlagen
Teil 1
- Folien 1. Teil (15.9.2007) – PDF, 1052kB
Beispiel-Code
- Makefile – Achtung, muss für euer System angepasst werden:
- Mac OS X mit SDL als framwork:
CFLAGS = SDLMain.m
undLIBS = -framework SDL -framework Cocoa -framework OpenGL
- Unix (inkl. Mac OS X mit SDL als .dylib):
CFLAGS = `sdl-config --cflags`
undLIBS = `sdl-config --libs` -lGL -lGLU
- Mac OS X mit SDL als framwork:
- basicsdl.cpp SDL "Rahmen-Applikation"
- triangle.cpp weißes Dreieck auf schwarzem Hintergrund
- Perspektive
- proj_ortho.cpp orthographische Projektion
- proj_persp.cpp perspektivische Projektion
- 3 Varianten, ein Dreieck zu verschieben:
- transtri1.cpp Vertices modifizieren
- transtri2.cpp glTranslatef()
- transtri3.cpp Kamera-Position verändern
- tricolor.cpp Dreieck in Farbe
- 3ddrawing.cpp 3D-Aufgabe "Haus"
- "Hausaufgabe"
- solarsystem.cpp Musterlösung Sonnensystem
- siehe auch Max' geniale Variante mit Perspektive vom Planeten aus: solar_final3.cpp.txt
Teil 2
- Folien 2. Teil (29.9.2007, WH 2.2.2008) - PDF, 1028 kB
Beispiel-Code
- Review
- review.cpp Wiederholung: Grundlagen
- Beleuchtung
- firstlight.cpp einfache Lichtquelle
- materialcolour.cpp Materialfarben
- components.cpp Materialkomponenten (ambient/diffuse/specular)
- lightcolour.cpp Lichtfarben
- movinglight.cpp bewegte Lichtquelle
- house.cpp das "Haus" vom 1. Workshop mit Beleuchtung
Teil 3
- Folien 3. Teil (9.2.2008) - PDF, 836 kB
Beispiel-Code
- Review
- solarsystem.cpp Musterlösung beleuchtetes Sonnensystem
- Needful Things
- tricolor_fullscreen.cpp Vollbild-Modus
- keyrepeat.cpp verbesserte Tastatureingabe
- tba.cpp zeitbasierte Animation
- Texturen
- texturing.cpp Texture.h Texture.cpp Makefile crate.png Einführungsbeispiel zur Texturierung
- texturing.cpp Image.h Image.cpp Makefile crate.png Einführungsbeispiel ohne Abstraktion (more hardcore)
Ports
- Python und pyglet (contributed by Marius) - die meisten C++ Beispiele sind bereits portiert, siehe jeweils Unterverzeichnis "python" am SVN-Server, zb. ws1/python/tricolor.py (Port von tricolor.cpp)
- GTK und Python (contributed by chrysn) - gtk_demo.py (Port von tricolor.cpp)
- SharpGL (contributed by MovGP0) - 3D-Aufgabe "Haus" (Visual Studio 2008; SharpGL) : SharpGL House
Misc.
- Nate Robins' Tutorials: Die von mir gezeigten Demos zu Projektion, Transformationen, &c. könnt ihr von von Nate Robins' Website herunterladen.
- solar_final2.cpp.txt Musterlösung Sonnensystem
- solar_final3.cpp.txt Musterlösung Sonnensystem mit Kamera auf Planet
- Help stamp out GL_PROJECTION abuse; mehr zum thema GL_PROJECTION / gluLookAt
- http://www.glprogramming.com/red/ - sehr praktischer guide
Einige wichtige Anmerkungen zu den letzten Workshops:
Lichtquellen-Positionierung
Die Position einer Lichtquelle wird bekanntlich wie folgt angegeben:
GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
Ich habe euch aber vorenthalten, was die vierte Komponente des Vektors ist.
WICHTIG! Wenn diese 0 ist, wird nur die Richtung der Lichtquelle in den Berechnungen verwendet, nicht ihre Position ("directional light"). Wenn die Lichtquelle an einem bestimmten Punkt in der Szene positioniert sein soll, sollte die letzte Komponente "1" sein.
Beispiel 1: Licht kommt aus der Richtung 1, 1, 1 (Position ist "unenendlich weit entfernt").
GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
Beispiel 2: Lichtquelle befindet sich am Punkt 0, 0, 0 (und scheint in alle Richtungen gleich stark).
GLfloat light_position[] = { 0.0, 0.0, 0.0, 1.0 };
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
Siehe zb. Musterlösung beleuchtetes Sonnensystem.
V-Sync
Anscheinend war meine Aussage, dass die Synchronisation mit dem Monitor-Refresh vom GL-Treiber automatisch aktiviert wird, etwas voreilig... und ihr müsst euch doch selbst darum kümmern. (Danke an chrysn fuer den Hinweis und die aktive Mitwirkung beim Testen!)
Seit SDL 1.2.10 gibt es eine plattformunabhängige Möglichkeit, V-Sync zu aktivieren:
SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, 1);
Achtung, dieser Aufruf muss *vor* SDL_SetVideoMode(...) passieren!
Leider scheint diese Funktionalität aber unter Linux mit ATI-Treiber nicht zu funktionieren... (?)
Kontakt
Wünsche, Anregungen, Beschwerden, Patches, etc. bitte an kyrah.
Push teh pixels!!