Asteroids3D Seminar: Game Programming Anita Dieckhoff, Pedro Flemming, Jan Ole Vollmer Betreuung: Christine Lehmann
Gliederung 2 1. Live-Demo und Spielidee 2. Softwarearchitektur und Szenengraph Übersicht 3. Rendering-Pipeline 4. Review Projektplanung 5. Hervorheben von Objekten 6. Oberflächenstruktur für Asteroiden 7. Energiefeld als Spielfeldbegrenzung 8. Spielmenü 9. Herausforderungen 10. Zusammenfassung und Zukünftige Arbeit
Live-Demo 3 Live-Demo
Softwarearchitektur Übersicht 4
Szenengraph Übersicht 5 Root Projectile Group Asteroid Group Wall Projectile Shader Asteroid Shader Lights Map Map Shader Player SkyDome Light Group Wall Shader SkyDome Shader Knoten State Attribut
Szenengraph Asteroiden 6 Asteroid Group Asteroid Asteroid Scale Scale Model 1... Asteroid Material 1... Asteroid Map Model...
Review Projektplanung 7 Themenvergabe Konzeptpräsentation Zwischenpräsentation Feature- Freeze Heute Projektile HUD PhysX Explosionen 3D-Map Asteroiden Hintergrund Bewegung des Spielers Sound 2D-Map Distanz- Visualisierung Schaden - Asteroiden
Rendering-Pipeline 8 Mehrere Rendering-Passes Erste Passes rendern Szenen-Geometrie Nachfolgende erzeugen Effekte Zwischenergebnisse in Form von G-Buffern Letzter Pass verblendet G-Buffer zum finalen Bild
Rendering-Pipeline 9 Color Scene Linear Depth Depth Map-Color Id Halo Hud Hud-Color Final
Hervorheben von Objekten (1) 10 Leuchtender Rahmen um Objekte ( Halo ) Berechnet mithilfe des ID-Buffers und linearisierten Z-Buffers In Abhängigkeit von Z zwischen 2 Farben interpoliert
Hervorheben von Objekten (2) 11 Wird pro Pixel im Fragment Shader berechnet Stärke abhängig von Distanz zu Objekt Pseudocode: if pixel == blank for sample in range if sample == id count++ alpha = mix(alpha1, alpha2, depth) * strength(count) rgb = mix(rgb1, rgb2, depth)
Hervorheben von Objekten (3) 12 Id Buffer Linear Depth Buffer Halo Buffer
Energiefeld als Spielfeldbegrenzung (1) 13 alpha = 0.5 + snoise v v alpha = 0.5 + snoise v v + snoise 2 2 v v + snoise 4 4 v v alpha = 0.5 + sin snoise v v + snoise 2 2 v v + snoise 4 4 v v alpha = 0.6 p + sin snoise v snoise 2 v + t + 2 v v + t snoise + 4 v v + t 4 Asteroids 3D Anita Dieckhoff, Pedro Flemming, Jan Ole Vollmer Game Programming
Energiefeld als Spielfeldbegrenzung (2) 14 varying vec4 position; varying vec4 vertex; uniform float time; void main() { vec3 seed = normalize(vertex.xyz); float scaledtime = time * 0.0002; float basealpha = clamp(pow(0.6, length(position) / 2500.0 + 3.0) - 0.02, -0.02, 0.2); float noise = simplexnoise(seed + scaledtime); noise += 0.5 * (simplexnoise(seed * 2.0 + scaledtime)); noise += 0.25 * (simplexnoise(seed * 4.0 + scaledtime)); float sinnoise = sin(noise * 30.0) * 0.02; float alpha = basealpha + sinnoise; gl_fragcolor = vec4(gl_color.rgb, alpha); } Asteroids 3D Anita Dieckhoff, Pedro Flemming, Jan Ole Vollmer Game Programming
Oberflächenstruktur für Asteroiden (1) 15 Asteroiden-Oberfläche erhält durch Displacement-Mapping Struktur Bei Treffern erzeugen Projektile Krater auf dem Asteroiden Vertex-Shader-Pseudocode: color = texture2d(displacementmap, gl_texcoord[0].st); float lum = 0.30*color.r + 0.59*color.g + 0.11*color.b; displacement = lum * intensity; position = vertex + normal * displacement; Quelle: László Szirmay-Kalos, Tamás Umenhoffer: Displacement Mapping on the GPU State of the Art
Oberflächenstruktur für Asteroiden (2) 16 Modell Asteroid Farb-Textur Displacement-Map
Oberflächenstruktur für Asteroiden (3) 17 Erzeugung von Kratern bei Projektil-Treffern Krater wird durch Vertex-Displacement dargestellt Displacement berechnet sich in Abhängigkeit des Abstandes des Vertex zum Krater-Zentrum Kraterfunktion y = f(x) Definitionsbereich ist auf [0, 1] normalisiert Wertebeispiele: x = 0 Abstand = 0, Kraterzentrum x = 1 Maximaler Kraterwirkungsbereich y = 0 Maximale Kratertiefe y = 1 Kein Displacement
Varianten der Kraterfunktion 18 f x = x f x = x 4 f x = 1. 1 1. 0 + 0. 1 4 1 0. 8 x, falls x < 0. 8 1 0. 2 x 1 2, sonst
Spielmenü 19 In QML (Qt Modeling Language) geschrieben Deklarative Sprache zur Programmierung von GUIs Interoperabilität mit C++ via Signal/Slot Konzept von Qt Rectangle { signal newgame() signal quit() QML-Ausschnitt } Column { MenuButton { text: "New Game" onclicked: mainmenu.newgame() } MenuButton { text: "Quit" onclicked: mainmenu.quit() } }
Herausforderung - Overview-Map 20 Orientierung im 3D-Raum ist eine besondere Herausforderung Bewegung in alle Richtungen möglich Permanentes Überwachen aller Richtungen 3D Idee: Projektion des 3D-Raums auf eine Übersichtskarte Darstellungs-Herausforderungen: Visualisierung der Distanz von Asteroiden Schnelle Orientierung zu Asteroiden Ansatz 1: 3D-Übersicht des Raumes Ansatz 2: 2D-Vogelperspektive 2D
Zusammenfassung 21 Verwendete Techniken: Displacement Mapping zur Erhöhung des Detailgrades der Asteroiden-Oberflächen Visualisierung der Distanz zu Asteroiden mit Halos durch G-Buffer Rendering Spielmenü mit QML Physik-Engine: Nvidia PhysX Sound-Engine: FMod Qt als Menü-Manager Besondere Herausforderung: Orientierung im 3D-Raum
Zukünftige Arbeit 22 Parametrisierung des Displacement Mappings für verschiedene Kratergrößen Parametrisierung der Halo-Visualisierung, um Distanz besser darzustellen Staubpartikel zur verbesserten Visualisierung der Bewegung des Spielers im Raum Verbesserte Orientierung durch statische Planeten
Vielen Dank 23 Vielen Dank für Ihre Aufmerksamkeit!
Referenzen 24 Displacement Mapping on the GPU State of the Art Szirmay-Kalos, Umenhoffer; http://sirkan.iit.bme.hu/~szirmay/egdisfinal3.pdf) Hardware Accelerated Per-Pixel Displacement Mapping Hirche, Ehlert, Guthe; http://dl.acm.org/citation.cfm?id=1006077 Comprehensible Rendering of 3-D Shapes Saito, Takahashi; http://dl.acm.org/citation.cfm?id=97901 The Triangle Processor and Normal Vector Shader Deering, Winner, Schediwy, Duffy, Hunt; http://dl.acm.org/citation.cfm?id=378468