CGSG/Workshop: Unterschied zwischen den Versionen

aus Metalab Wiki, dem offenen Zentrum für meta-disziplinäre Magier und technisch-kreative Enthusiasten.
Zur Navigation springenZur Suche springen
Zeile 24: Zeile 24:
#[[Benutzer:Bountin|Bountin]]
#[[Benutzer:Bountin|Bountin]]
#[[User:steffi|steffi]]
#[[User:steffi|steffi]]
#[[User:ylem235|ylem235]]


# ''your name here''
# ''your name here''

Version vom 1. Oktober 2009, 03:15 Uhr

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

kyrah bietet an, die Einführungsworkshops im Herbst 2009 zu wiederholen - sofern daran Interesse besteht.

Bitte unverbindlich eintragen, wer daran interessiert wäre:

  1. michael
  2. geo
  3. Pepi
  4. georg k.
  5. alpi
  6. Olaf
  7. jürgen
  8. cypher
  9. tkolar
  10. Phantasus
  11. oib
  12. skrach
  13. queltos
  14. ra
  15. amir
  16. Bountin
  17. steffi
  18. ylem235
  1. your name here

Unterlagen

Teil 1

Beispiel-Code

  1. Makefile – Achtung, muss für euer System angepasst werden:
    1. Mac OS X mit SDL als framwork: CFLAGS = SDLMain.m und LIBS = -framework SDL -framework Cocoa -framework OpenGL
    2. Unix (inkl. Mac OS X mit SDL als .dylib): CFLAGS = `sdl-config --cflags` und LIBS = `sdl-config --libs` -lGL -lGLU
  2. basicsdl.cpp SDL "Rahmen-Applikation"
  3. triangle.cpp weißes Dreieck auf schwarzem Hintergrund
  4. Perspektive
    1. proj_ortho.cpp orthographische Projektion
    2. proj_persp.cpp perspektivische Projektion
  5. 3 Varianten, ein Dreieck zu verschieben:
    1. transtri1.cpp Vertices modifizieren
    2. transtri2.cpp glTranslatef()
    3. transtri3.cpp Kamera-Position verändern
  6. tricolor.cpp Dreieck in Farbe
  7. 3ddrawing.cpp 3D-Aufgabe "Haus"
  8. "Hausaufgabe"
    1. solarsystem.cpp Musterlösung Sonnensystem
    2. siehe auch Max' geniale Variante mit Perspektive vom Planeten aus: solar_final3.cpp.txt

Teil 2

Beispiel-Code

  1. Review
    1. review.cpp Wiederholung: Grundlagen
  2. Beleuchtung
    1. firstlight.cpp einfache Lichtquelle
    2. materialcolour.cpp Materialfarben
    3. components.cpp Materialkomponenten (ambient/diffuse/specular)
    4. lightcolour.cpp Lichtfarben
    5. movinglight.cpp bewegte Lichtquelle
    6. house.cpp das "Haus" vom 1. Workshop mit Beleuchtung

Teil 3

Beispiel-Code

  1. Review
    1. solarsystem.cpp Musterlösung beleuchtetes Sonnensystem
  2. Needful Things
    1. tricolor_fullscreen.cpp Vollbild-Modus
    2. keyrepeat.cpp verbesserte Tastatureingabe
    3. tba.cpp zeitbasierte Animation
  3. Texturen
    1. texturing.cpp Texture.h Texture.cpp Makefile crate.png Einführungsbeispiel zur Texturierung
    2. texturing.cpp Image.h Image.cpp Makefile crate.png Einführungsbeispiel ohne Abstraktion (more hardcore)

Ports

Misc.

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!!