3D-Effekte für Spieleprogrammierer Die praktische Referenz ALEXANDER RUDOLPH
INHALTS- VERZEICHNIS
Einleitung 17 Über das Buch 18 Anforderungen an Computer und Grafikkarte 18 Konventionen 19 Feedback 19 Danksagungen 19 1 Asteroidenjagd im Weltraum Spieleprogrammierung für Minimalisten 21 1.1 Über die Arbeit mit Visual C++ 22 1.1.1 Ein Projekt Schritt für Schritt erstellen 22 1.1.2 Installation des DirectX-SDK 26 1.1.3 Einstellen der DirectX-Verzeichnispfade 26 1.1.4 Verwendete DirectX-Bibliothekdateien 27 1.2 Entwurfsarbeit 28 1.2.1 Titel und Beschreibung 28 1.3 Die Rahmenanwendung eines Spiels (Game Shell) 29 1.3.1 Die Funktionsweise einer Windows-Anwendung 29 1.3.2 Der Game Shell-Programmcode 31 1.4 Initialisierungs-, Aufräumarbeiten und Spielschleife 34 1.4.1 Initialisierungsarbeiten 34 1.4.2 Aufräumarbeiten 35 1.4.3 Die Spielschleife (Game Loop) 36 1.5 DirectX Graphics 39 1.5.1 Bilddarstellung 39 1.5.2 Transformations- und Beleuchtungspipeline 40 1.5.3 View- und Projektionsmatrizen initialisieren 45 1.5.4 DirectX-Ersetzungen 46 1.5.5 DirectX Graphics initialisieren 46 1.5.6 DirectX Graphics beenden 54 1.5.7 Ein 3D-Szenario anzeigen 54 1.5.8 Basiswissen für den Schnelleinstieg 57 1.5.9 Spielablauf (Game Logic) 61 1.5.10 Handling der Asteroiden 65 1.5.11 Sortieren der Asteroiden gemäß ihrer Kameraabstände zur Vermeidung von Darstellungsfehlern 67 1.5.12 Flexible Vertexformate (FVF) 68 1.5.13 Grafikprimitiven 69 1.5.14 Culling von Vertexdaten 70 1.5.15 Darstellung eines 2D-Sternenfeldes 70 1.5.16 Texture Mapping 73 6
1.5.17 Darstellung von Sonne und Erde, der Asteroiden, der Plasmaprojektile und des Fadenkreuzes 78 1.5.18 Einfache Explosionsanimationen 88 1.6 Spielsteuerung mit DirectInput 94 1.6.1 Globale Variablen, Definitionen, Header-Dateien und Funktionsprototypen 94 1.6.2 Initialisierung des DirectInput-Hauptinterface 95 1.6.3 Initialisierung eines Tastatur-Objekts 96 1.6.4 Initialisierung eines Maus-Objekts 97 1.6.5 Initialisierung eines Joystick-Objekts 98 1.6.6 Abfrage der Tastaturnachrichten 101 1.6.7 Abfrage der Mausnachrichten 103 1.6.8 Abfrage von Joysticknachrichten 105 1.6.9 Freigabe aller DirectInput-Objekte 106 1.7 Musik und 3D-Sound mit DirectX Audio 106 1.7.1 Begriffserklärungen 107 1.7.2 CMusicManager und CMusicSegment zwei wichtige Helper-Klassen 107 1.7.3 Globale Variablen, Definitionen, Header-Dateien und Funktionsprototypen 108 1.7.4 Soundobjekte erzeugen 109 1.7.5 Parameter für die Wiedergabe des 3D-Sounds festlegen 111 1.7.6 Soundobjekte freigeben 112 1.7.7 Hintergrundmusik abspielen, stoppen und Lautstärkeregelung 112 1.7.8 3D-Soundbuffer vor dem Abspielen ausrichten und 3D-Sound abspielen 113 1.8 Zusammenfassung 114 2 Eine frei konfigurierbare Spielsteuerung 115 2.1 Das Demoprogramm kurz vorgestellt 116 2.2 Globale Variablen 117 2.3 Tastatur- und Joystickbelegung frei konfigurieren 117 2.3.1 Die Idee hinter der praktischen Umsetzung 117 2.3.2 Änderung der Tastaturbelegung 118 2.3.3 Änderung der Joystickbelegung 119 2.3.4 Laden und Speichern der aktuellen Tastaturund Joystickbelegung 120 2.3.5 Der Programmcode im Überblick 121 2.4 Visualisieren der Tastatur- und Joystickeingaben 129 2.5 Zusammenfassung 132 7
3 Hintergrundgestaltung und Spielsteuerung in 2D-Spielen 133 3.1 Die 2D-Tile-Engine kurz vorgestellt 134 3.2 Verwendete Dateiformate 135 3.2.1 Speichern der Texturpfade 136 3.2.2 Speichern der Tiles 136 3.3 Szenenaufbau 137 3.4 Änderung der Kameraperspektive 139 3.5 Darstellung des Mauszeigers 140 3.6 Klassenentwürfe 141 3.6.1 Die Klasse CTileEngine 141 3.6.2 Die Klasse CTileQuad 141 3.6.3 Die Klasse CTileTextures 142 3.7 Initialisierungsarbeiten 143 3.7.1 Initialisierung der Tile-Engine 143 3.7.2 Initialisierung eines Tilequads 144 3.8 Rendern der Hintergrund-Tiles 146 3.9 Sichtbarkeitstests 147 3.9.1 Objekt-Culling 147 3.9.2 Cullen der Hintergrund-Tiles 149 3.10 Spielsteuerung (in Strategiespielen) 151 3.10.1 Abfrage der Mausnachrichten 152 3.10.2 Abfrage der Tastaturnachrichten 154 3.11 Zusammenfassung 155 4 2D-Objekte und Kameradrehungen im 3D-Raum 157 4.1 Asteroidenjagd im 3D-Raum 158 4.2 Kameradrehungen 159 4.2.1 Funktionen für die Kameradrehung 159 4.2.2 Objekte entsprechend ihres Kameraabstands im 3D-Raum sortieren 163 4.3 Spielsteuerung 163 4.3.1 Verarbeiten der eingegangenen Steuerbefehle 164 4.3.2 Abfrage der Tastaturnachrichten 165 4.3.3 Abfrage der Mausnachrichten 165 4.4 Billboard-Transformationsfunktionen 169 4.4.1 Ein Billboard unter Verwendung des Ortsvektors ausrichten und positionieren 170 4.4.2 Ein Billboard unter Verwendung von Polarkoordinaten ausrichten und positionieren 172 4.4.3 Ein Billboardkreuz unter Verwendung von Polarkoordinaten ausrichten und positionieren 173 4.5 3D-Sternenfeld 175 4.6 Hintergrundnebel 176 4.7 Zusammenfassung 178 8
5 Einstieg in die 3D-Programmierung 179 5.1 Direct3D-Lichtquellen und -Materialeigenschaften 180 5.1.1 Ambientes Licht 181 5.1.2 Direkte Lichtquellen 181 5.1.3 Materialeigenschaften 184 5.1.4 Vertexformate für die Arbeit mit untransformierten, unbeleuchteten Vertices 184 5.2 Farb- und Alphaoperationen 185 5.3 Multitexturing 187 5.3.1 Detail Mapping 187 5.3.2 Glow Mapping 188 5.3.3 Dark Mapping 189 5.3.4 Zurücksetzen der Farboperationen nach dem Rendern 189 5.4 Texturfilterung 189 5.4.1 Übersicht über die möglichen Filterungstechniken 189 5.4.2 Vergleich zwischen bilinearer und anisotroper Filterung 190 5.4.3 Verwendung von Mipmaps 190 5.5 Sonne und Sonnenstrahlen 191 5.6 Lens Flares 194 5.7 Indizierte Dreieckslisten bei der Darstellung von 3D-Objekten 199 5.7.1 Einen Indexbuffer erzeugen 200 5.7.2 Einen Indexbuffer für eine geometrische Grundform erzeugen 200 5.7.3 Einen Vertexbuffer für ein Kugelmodell erzeugen 202 5.7.4 Rendern einer indizierten Dreiecksliste 204 5.8 Planeten 205 5.8.1 Planetenmodell und -Texturen 205 5.8.2 Initialisierung und Darstellung eines Planeten 208 5.9 Sky-Sphären und -Boxen 213 5.10 Die physikalisch korrekte Kollisionsbeschreibung für Massenpunkte 216 5.10.1 Der eindimensionale Stoß 217 5.10.2 Der eindimensionale Stoß mit beliebig orientierter Kollisionsachse 218 5.10.3 Der dreidimensionale Stoß 219 5.11 Kollisionserkennung mithilfe von Bounding-Boxen 223 5.11.1 Ein einfaches Kollisionsmodell kurz vorgestellt 223 5.11.2 Achsenausgerichtete Bounding-Boxen (AABB) 224 5.11.3 Orientierte Bounding-Boxen (OBB) 226 5.11.4 Aufbau eines AABB-Kollisionsmodells 231 5.11.5 Das Kollisionsmodell im Einsatz 236 5.12 Verschiedenartige Objekte gemäß ihrer Kameraabstände sortieren 239 5.13 Asteroiden und Gesteinsbrocken 241 5.14 Explosionen für Fortgeschrittene 247 5.15 Zusammenfassung 258 9
6 3D-Modelle 259 6.1 Ein Programm zur Modellierung von Asteroiden und Gesteinsbrocken 260 6.1.1 Überblick über die verwendeten Klassen 262 6.1.2 Dateimanagement 265 6.1.3 Ein Asteroid-Mesh modellieren 266 6.2 X-Modelle (3D-Modelle im X-Dateiformat) 270 6.2.1 Überblick über die verwendeten Klassen 271 6.2.2 Eine X-Datei laden 271 6.2.3 Ein X-Modell rendern 275 6.3 X-Dateien in ein eigenes Modellformat konvertieren und speichern 276 6.4 3D-Modelle im eigenen Modellformat laden und darstellen 281 6.4.1 Überblick über die verwendeten Klassen 282 6.4.2 Vertexnormalen für ein 3D-Modell berechnen 283 6.5 Mesh Simplification verschiedene LOD-Stufen für ein 3D-Modell erzeugen 284 6.5.1 Mesh Simplification durch Kantenkollapse 286 6.5.2 Die CEdge-Klasse für die Verwaltung der Eigenschaften einer Dreieckskante 287 6.5.3 Alle Dreieckskanten identifizieren und ihre Seitigkeit bestimmen 288 6.5.4 Diejenigen zweiseitigen Kanten bestimmen, die für einen Kantenkollaps in Frage kommen 290 6.5.5 LOD-Stufen für ein 3D-Modell erzeugen 291 6.6 Kollisions- und Schnittpunkttests auf Dreiecks- und Vierecksbasis 295 6.6.1 Die Normalenform einer Ebene 295 6.6.2 Schnittpunkt mit einer Ebene 296 6.6.3 Der Halbseitentest 296 6.6.4 Die Klasse CTriangle 298 6.6.5 Rücktransformation auf die Modellkoordinaten 303 6.6.6 Dreieck-Dreieck-Schnittpunkttest 305 6.6.7 Die Klasse CQuad 306 6.6.8 Verbesserung der Performance der Kollisionsund Schnittpunkttests auf Dreiecksbasis 311 6.7 Zusammenfassung 316 7 Einführung in die HLSL-Shader-Programmierung 317 7.1 HLSL-Programme als Effekt-Dateien in die eigene Anwendung einbinden 318 7.1.1 Effekt-Dateien genauer betrachtet 319 7.1.2 Effekt-Dateien in eine DirectX-Anwendung einbinden 321 7.1.3 Einen Effekt verwenden 321 7.1.4 Erweiterungen 323 7.2 HLSL der erste Kontakt 323 7.2.1 Ein einfacher Vertex Shader 323 7.2.2 Ein HLSL-Programm verwenden 325 10
7.2.3 Ein einfacher Pixel Shader 326 7.2.4 Einfachstes Texture Mapping 327 7.2.5 Das Texture-Mapping-Programm verwenden 329 7.2.6 Zugriff auf Vektor- und Matrizenelemente nehmen 329 7.3 Beleuchtungsmodelle verstehen lernen 331 7.3.1 Die diffuse Reflexion 331 7.3.2 Die einfach-ambiente und hemisphärisch-ambiente Reflexion 332 7.3.3 Die spiegelnde Reflexion 334 7.4 Beleuchtungsmodelle im Vertex Shader implementieren 336 7.4.1 Ein Vertex Shader für die hemisphärisch-ambiente Reflexion 336 7.4.2 Alternative Berechnung des Reflexionsanteils im Modellkoordinatensystem 338 7.4.3 Ein Vertex Shader für die Berechnung der einfach-ambienten, direktional-diffusen und -spiegelnden Reflexion 339 7.4.4 Vereinfachte Berechnung des spiegelnden Reflexionsanteils 343 7.4.5 Punktlicht-Reflexionen berechnen 343 7.5 Per Pixel Beleuchtung mit Dotproduct3 Bump Mapping (Normal Mapping) 345 7.5.1 Wie lassen sich Normalenvektoren in einer Textur speichern? 347 7.5.2 Berechnung der einfach-ambienten, direktional-diffusen und -spiegelnden Reflexion auf Pixelbasis 349 7.6 Shadow Mapping 365 7.6.1 Initialisierung der Light Depth Map, des zugehörigen z-buffers und des Viewports 366 7.6.2 Rendern des Tiefenabbilds der 3D-Szene aus der Blickrichtung des Lichts in die LightDepthColorTexture 368 7.6.3 Vertex und Pixel Shader zum Rendern des Tiefenabbilds der 3D-Szene aus der Blickrichtung des Lichts in die LightDepthColorMap 372 7.6.4 Shadow Mapping im Detail erklärt 373 7.6.5 Übergabe der für das Shadow Mapping benötigten Daten an das verwendete Shader-Programm 377 7.6.6 Das Shader-Programm ShadowOnly.fx im Überblick 378 7.6.7 Shadow Mapping kombiniert mit einfach-ambienter, direktional-diffuser und -spiegelnder Beleuchtung auf Pixelbasis 382 7.7 Zusammenfassung 384 8 Animation von 3D-Modellen 385 8.1 Key Frame- und Bone Frame-Animationen 386 8.2 Dateiformate für die Beschreibung der Animationsskelette und -posen 388 8.3 Kinematik 390 8.4 Klassen für die Beschreibung eines Animationsskeletts 393 8.4.1 Die CJoint-Klasse für das Handling eines Gelenks (Joints) 393 8.4.2 Die CBone-Struktur für die Beschreibung eines Knochens 395 11
8.4.3 Die CJointHierarchy-Klasse für die Beschreibung einer Gelenk-Hierarchie 396 8.4.4 CSkeleton-Klasse für das Handling des Animationsskeletts 397 8.5 Darstellen der animierten Gelenkpositionen und Knochen 398 8.5.1 Berechnen der Gelenk-Rotations- sowie der Gelenk-Translationsmatrizen 399 8.5.2 Berechnen der animierten Gelenkpositionen im Modellkoordinatensystem 400 8.5.3 Darstellen der animierten Gelenkpositionen und Knochen 402 8.6 Zusammenspiel zwischen einem 3D-Modell und einem Animationsskelett 403 8.6.1 Vertexformat für ein animiertes Mesh 403 8.6.2 Automatische Zuordnung zwischen den Vertices eines 3D-Modells und den Gelenken eines Animationsskeletts 404 8.6.3 Indiziertes Vertex Blending 408 8.7 Treffer- und Kollisionserkennung mit einem animierten Mesh 411 8.8 Zusammenfassung 412 9 Simulierte Physik 413 9.1 Das Massenpunktmodell 414 9.1.1 Ein Blick ins Physikbuch 414 9.1.2 Ein Dateiformat zum Speichern der Massenpunktmodell-Daten 416 9.1.3 Ein Dateiformat zum Speichern der Eigenschaften der zu simulierenden Körper 417 9.1.4 Berechnung von Schwerpunkt und Gesamtmasse 418 9.1.5 Schwerpunktkoordinaten der Massenpunkte 419 9.1.6 Die Anfangsrotation eines Körpers bestimmen 420 9.1.7 Wechselwirkungskräfte zwischen den Massenelementen 423 9.1.8 Newton-Reibung 424 9.1.9 Bodenreibung 425 9.1.10 Auftriebskraft und Schwimmfähigkeit 427 9.1.11 Beschleunigung und Bewegung simulieren 429 9.1.12 Die Orientierung eines Körpers berechnen 433 9.1.13 Kollision zwischen zwei Körpern 436 9.2 Das Simulationsprogramm im Überblick 439 9.2.1 Die Klasse CSimulatedBodies 439 9.2.2 Die Klasse CBody 440 9.2.3 Die Klasse CMassElement 442 9.2.4 Die Klasse CBonding 444 9.3 Zusammenfassung 444 12
10 Weltraumgestaltung für Fortgeschrittene 445 10.1 Das Sonnensystem 446 10.1.1 Position, Geschwindigkeit und Rotation der Planeten und Monde 448 10.1.2 Initialisierung eines Asteroidengürtels 450 10.1.3 Dateiformate für die Beschreibung des Sonnensystems 452 10.1.4 Der CSolarSystem-Klassenentwurf 456 10.2 Die Spielewelt 458 10.2.1 Die Klasse C3DScenario 458 10.2.2 Die Klasse CGamesWorld 458 10.2.3 Ablaufsteuerung der Sonnensystem-Simulation 470 10.2.4 Himmelsmechanik am Beispiel der Planetenring-Asteroiden 476 10.2.5 Handling der Planeten 480 10.3 Darstellung der Planeten und Monde 485 10.3.1 Aufruf der Renderfunktionen für die Darstellung der Planeten und Monde 485 10.3.2 Ein Vertexbuffer für die Darstellung der Planetenringe 487 10.3.3 Renderfunktionen für die Darstellung der Planetenringe, der Planetenoberfläche sowie seiner Atmosphäre 489 10.4 Berechnung der Normal Maps für die Beleuchtung der Planeten, Monde und Asteroiden 496 10.5 HLSL-Shader für die Darstellung der Sky-Sphäre, der Planeten und Asteroiden 503 10.5.1 Leuchtende Hintergrundnebel auf der Sky-Sphäre 504 10.5.2 Pixelgenaue Beleuchtung der Planetenoberfläche, Darstellung der Planetenringe und der Atmosphäre 506 10.5.3 Pixelgenaue Beleuchtung der Asteroiden 510 10.6 Zusammenfassung 513 11 Partikel-, Waffen- und Schildeffekte, dynamische Beleuchtung und Texturierung von 3D-Modellen 515 11.1 Einzelheiten bei der Darstellung der Raumschiffe 516 11.2 Rauch- und Antriebspartikel 519 11.2.1 Rauch- und Antriebspartikel initialisieren und bewegen 520 11.2.2 Rendern der Rauch- und Antriebspartikel eines Raumschiffs 523 11.2.3 Zwei Klassen für das Handling der Rauch- und Antriebspartikel 525 11.3 Energieschilde 529 11.3.1 Eine Klasse für das Handling des Energieschilds 530 11.3.2 Der EnergyShield-HLSL-Shader 534 11.4 Dynamische Beleuchtung und Texturierung von 3D-Modellen 537 11.4.1 Rendern des Schiffsmodells 537 11.4.2 Der SpaceShip-HLSL-Shader 540 11.5 Darstellung der Waffenobjekte 550 11.6 Zusammenfassung 552 13
12 Spielmechanik 553 12.1 Handling der Waffensysteme 554 12.2 Dynamisches Handling der Waffenobjekte 558 12.3 Kollisionsprävention und Treffererkennung 565 12.3.1 Verwalten der Kollisionsdaten 565 12.3.2 Treffererkennung 567 12.3.3 Kollisionsprävention 571 12.3.4 Eine Funktion für die Kollisionsprävention und Treffererkennung 572 12.4 KI-Programmierung 577 12.4.1 Ausarbeiten einer Befehlskette 578 12.4.2 Verwalten der Missionsziele eines Raumschiffs 578 12.4.3 KI-Steuerung eines Raumschiffs 580 12.4.4 KI-Helper-Funktionen für die Berechnung der Kurskorrekturen 588 12.4.5 Manövertaktiken festlegen 591 12.4.6 Änderung der Flugrichtung 592 12.5 Zusammenfassung 592 13 Musikauswahl, Missions-Scripting und Kamerasteuerung 593 13.1 Abspielen der einzelnen Musikstücke 594 13.2 Handling der Missionsnachrichten 596 13.3 Beurteilung des aktuellen Missionsstatus 603 13.4 Kameraführung 606 13.4.1 Eine Klasse für das Handling von vorprogrammierten Kameraeinstellungen 606 13.4.2 Neuausrichten der Kamera 612 13.4.3 Kameraverfolgung eines Raumschiffs 614 13.5 Zusammenfassung 616 14 Echtzeit-Wassereffekte 617 14.1 Wasser aus der Sicht des Spieleprogrammierers 618 14.2 Einbinden des Wasser-Renderers in eine Terrain Engine 621 14.3 Klassenentwurf für einen Wasser-Renderer 622 14.4 Initialisierungsarbeiten 623 14.5 Über dem Wasser oder unter Wasser? 628 14.6 Berechnung der Sichtmatrizen und Clipping Planes 630 14.7 Über- und Unterwasser-Polygon-Clipping 634 14.8 Environment Mapping 634 14.9 Berechnung der Bump Mapping-Matrizen 636 14.10 Rendern des Wasserbassins 637 14.11 Die Wasseroberfläche rendern 638 14.12 Der High-Quality-HLSL-Water-Shader 641 14.13 Zusammenfassung 649 14
15 Tageszeitänderungen und Wettereffekte 651 15.1 Berechnung der Uhrzeit 652 15.2 Die scheinbare Sonnenbahn zu verschiedenen Jahreszeiten 654 15.2.1 Die Erdrotationsachse ausrichten und die Jahreszeitkorrektur 655 15.2.2 Ausbreitungsrichtung, Farbe und Intensität des Sonnenlichts berechnen (Simulation der Erddrehung) 656 15.3 Himmelsdarstellung bei verschiedenen Witterungsverhältnissen und Tageszeiten 657 15.3.1 CWeather-Klasse für die Simulation von verschiedenen Witterungsverhältnissen 658 15.3.2 Niederschlagssimulation 667 15.3.3 Das Himmelsgewölbe darstellen 674 15.3.4 Hintergrundsterne 679 15.3.5 Darstellung und Bewegung der Sonne 680 15.3.6 Wolkenbewegung und -darstellung 683 15.3.7 Blitze 689 15.3.8 Rendern des Himmels in eine Environment Cube Map 694 15.4 Zusammenfassung 698 16 Terrain Rendering 699 16.1 Der Terrain Renderer kurz vorgestellt 700 16.1.1 Terrain-Eigenschaften 702 16.1.2 Terrain Tiles 702 16.1.3 Texturen 704 16.1.4 Environment-Mapping-Einstellungen 704 16.1.5 Klassenentwürfe 705 16.1.6 Einbinden des Terrain Renderers in ein Beispielprogramm 708 16.2 Initialisierungsarbeiten 715 16.2.1 Aufruf des CTerrain-Konstruktors 715 16.2.2 Die Helperklasse CTerrainMesh für die Generierung der Terrain-Vertexdaten 721 16.2.3 Die Klasse CIndexBuffer für die Verwaltung eines Terrain Tile-Indexbuffers 725 16.2.4 Eine Terrain Tile initialisieren 726 16.3 Der Terrain Renderer im Einsatz 731 16.3.1 Terrain Tile unterhalb der Kamera bestimmen 731 16.3.2 Den Abstand zum Terrain unterhalb der Kamera bestimmen 732 16.3.3 Terrain Tile-Sichtbarkeitstest 734 16.3.4 Rendern des Terrains in die Light Depth Map 739 16.3.5 Rendern einer Terrain Tile in die Light Depth Map 740 16.3.6 Vorbereitende Arbeiten für die Terrain-Darstellung 741 16.3.7 Rendern des Terrains 744 15
16.3.8 Rendern einer Terrain Tile 748 16.3.9 Der Ultra-High-Quality-HLSL-Tile-Shader 749 16.4 Zusammenfassung 760 17 Architektur-Rendering 761 17.1 Der Architektur-Renderer kurz vorgestellt 762 17.1.1 Verwendete Modellformate 765 17.1.2 Klassenentwürfe 769 17.2 Der Architektur-Renderer im Einsatz 780 17.2.1 Die Positionen der regengeschützten Flächen im Kameraraum bestimmen 780 17.2.2 Suche nach den sichtbaren Gebäuden 780 17.2.3 Kollisionstest zwischen den Spieleobjekten und den Fassaden- bzw. Innenraum-Konstruktionselementen 791 17.2.4 Rendern der Gebäude 794 17.2.5 Rendern eines Fassaden-Konstruktionselements 802 17.2.6 Rendern eines Innenraum-Konstruktionselements 807 17.2.7 HLSL-Shader-Programme für die Darstellung der Konstruktionselemente 812 17.3 Zusammenfassung 831 A Die Buch-CD 833 B Internetseiten rund um die Spieleentwicklung 837 B.1 Deutschsprachige Seiten 838 B.2 Englischsprachige Seiten 838 C Listingverzeichnis 839 Stichwortverzeichnis 849 16