-
Vergleich zu 2D-Desktop-Grafik (STP008)
- Zeichenreihenfolge ist nicht so offensichtlich (Was ist vorne? Was ist hinten?)
- höherer Anspruch an Realismus: dynamische Beleuchtung, Texturierung, etc.
- Randbemerkung: auch 2D-Spiele werden heute meist in einer 3D-Szene aufgebaut
- Grundeinheit für 3D-Modelle: nicht der Pixel, sondern das Polygon (deswegen kommen wir um Fließkommazahlen nicht herum)
-
Vorbemerkungen zu den folgenden Schritten:
-
Schritt 1: 3D-Modell mit Polygonen
-
Schritt 2: Kamera
- grundsätzlich ein Paar aus Blickpunkt und Blickrichtung, aber mit einigen weiteren Parametern
- mathematische Grundlage: Quaternionen
- Sichtfeld (Field of View): beim Menschen 130°; bei Videospielen meist weniger, je nachdem, wieviel Platz der Bildschirm im Sichtfeld einnimmt (z.B. 90° am PC, 60° an Konsolen)
-
Schritt 3: Ausmalen der Polygone (Rasterisierung)
-
Schritt 4: Texturen
-
Einwurf: Was unterscheidet einen Grafikprozessor (GPU) von einem Hauptprozessor (CPU)?
- CPU-Kerne führen einzelne Befehle auf einzelnen Daten aus
- GPU führt einzelne Befehle auf vielen Daten gleichzeitig aus, z.B. Rasterisierung von 10000 Polygonen gleichzeitig oder Z-Buffer-Prüfung für 10000 Pixel gleichzeitig
- dadurch auch für andere massiv parallelisierbare Operationen interessant ("GPGPU", General Purpose GPU), z.B. wissenschaftliche Simulationen, maschinelles Lernen, Passwortknacken
-
Schritt 5: Shader
- bis jetzt haben wir die Fixed Function Pipeline beschrieben, eine im GPU-Treiber fest vorgegebene Kette von Rendering-Schritten
- neuere GPU (seit den frühen 2000ern) erlauben das Einbetten von eigenen Programmen (Shadern) in die Pipeline
- Vertex Shader: wird einmal pro Vertex (Ecke eines Polygons) aufgerufen, um die 2D-Position auf dem Bildschirm zu berechnen (ansonsten normale Berechnung anhand der konfigurierten Kameraposition)
- Fragment Shader: wird einmal pro Pixel aufgerufen, um gegebenenfalls die Farbe des Pixels zu modifizieren
- Beispiel eines Fragment-Shaders, der eine Farbtextur auf 6 feste Farbstufen reduziert
-
Schritt 6: Beleuchtung
- bei traditionallen 2D-Spielen mit Sprites war Beleuchtung meist global (z.B. jedes Objekt hat 2 Sprites, einmal für dunkle und einmal für helle Szenen)
- dynamische Beleuchtung: heute meist als Teil des Fragment Shaders
- Beispiel: Phong's Approximation einer natürlichen Beleuchtung
-
- Anteil: ambiente Beleuchtung (überall gleich stark, Grundausleuchtung wie in einem Fernsehstudio)
-
- Anteil: diffuse Beleuchtung (abhängig davon, wie sehr die beleuchtete Fläche zur Lichtquelle hingewendet ist)
-
- Anteil: spekulare Beleuchtung (Glänzen; stark überbetont auf Flächen, die fast exakt zur Lichtquelle hingewendet sind)
-
es gibt noch so viel mehr: Kantenglättung (Antialiasing), lineares und anisotropisches Filtern, Normal Mapping, Raytracing