Inhaltsverzeichnis
- Vorwort
- Grafikprogrammierung lernen
- Sich nicht in Kleinigkeiten verlieren
- Warum Vulkan?
- Vulkan lernen
- Überblick über die Engine und Frame-Analyse
- Allgemeine Ratschläge
- Empfohlene Vulkan-Bibliotheken
GfxDevice-Abstraktion
- Shader-Verarbeitung
- Push Constants, Descriptor Sets und Bindless Descriptors
- Pipeline-Muster
- Einsatz von Programmable Vertex Pulling (PVP) + Buffer Device Address (BDA)
- Bindless Descriptors
- Umgang mit dynamischen Daten, die in jedem Frame hochgeladen werden müssen
- Destruktoren, Deletion Queue und Cleanup
- Synchronisierung
- Weitere Implementierungsnotizen
- Viele Sprites zeichnen
- Compute Skinning
- Trennung von Spiel und Renderer
- Szenenladen und Entity-Prefabs
- MSAA
- UI
- Dear ImGui und sRGB-Probleme
- Sonstiges
- Erkenntnisse aus dem Umstieg auf Vulkan
- Künftige Arbeiten
Vorwort
- Dies dokumentiert die Erfahrung, Vulkan zu lernen und eine kleine Game Engine zu schreiben.
- Daran wurde drei Monate lang ohne Vorkenntnisse zu Vulkan gearbeitet.
- Es wurde ein kleines 3D-Spiel erstellt und wiederverwendbare Teile als Engine ausgelagert.
Grafikprogrammierung lernen
- Wer gerade erst mit Grafikprogrammierung beginnt, sollte mit OpenGL anfangen.
- Es ist hilfreich, mit OpenGL zu lernen, wie man texturierte Modelle auf dem Bildschirm darstellt und einfache Beleuchtung sowie Shadow Mapping umsetzt.
- Empfohlene Ressourcen zum Lernen von OpenGL:
- learnopengl.com
- das Buch Anton’s OpenGL 4 Tutorials
- Vorlesungen von Thorsten Thormählen (empfohlen werden die ersten 6 Videos)
Sich nicht in Kleinigkeiten verlieren
- Man sollte darauf achten, sich nicht in Kleinigkeiten zu verlieren.
- Man sollte sich immer fragen: „Wird das wirklich gebraucht?“ und „Wird das ein Bottleneck?“
- Nicht benötigte Funktionen können später ergänzt werden.
- Es ist besser, mit einem einfachen Spiel anzufangen und darauf zu achten, keine unnötig komplexe Engine zu bauen.
Warum Vulkan?
- Vulkan erlaubt die Nutzung moderner GPU-Funktionen und eignet sich für Menschen, die Open-Source-Technologien und Standards bevorzugen.
- OpenGL reicht für kleine Spiele aus, macht die Nutzung moderner GPU-Funktionen jedoch schwieriger und ist unter macOS nur eingeschränkt nutzbar.
- WebGPU ist leichter zu lernen als Vulkan und ermöglicht es, Spiele im Browser auszuführen.
Vulkan lernen
- Das Lernen von Vulkan wirkte anfangs schwierig, wurde aber leichter, weil Khronos komplexe Teile vereinfacht und nützliche Bibliotheken bereitgestellt hat.
- Empfohlene Ressourcen zum Lernen von Vulkan:
- vkguide
- die Vulkan-Vorlesungsreihe der TU Wien
- das Buch 3D Graphics Rendering Cookbook
- das Buch Mastering Graphics Programming with Vulkan
Überblick über die Engine und Frame-Analyse
- Die Engine heißt EDBR (Elias Daler’s Bikeshed Engine) und begann als Lernprojekt für Vulkan.
- Die Engine eignet sich hauptsächlich für kleine levelbasierte Spiele.
- Ablauf des Frame-Renderings:
- Skinning: Verarbeitung des Model-Skinnings mit Compute Shadern
- Shadow Mapping: Verwendung einer 4096x4096-Depth-Texture
- Geometrie und Shading: Verwendung eines PBR-Modells
- Depth Resolve: manuell über den Fragment Shader verarbeitet
- Post-Processing-Effekte: Anwendung von Depth Fog, Tone Mapping und Bloom
- UI: Zeichnen der UI mit einem einzigen Draw Call
Allgemeine Ratschläge
Empfohlene Vulkan-Bibliotheken
- vk-bootstrap: vereinfacht den Vulkan-Initialisierungscode
- Vulkan Memory Allocator (VMA): verwaltet Speicherallokationen
- volk: vereinfacht das Laden von Erweiterungsfunktionen
GfxDevice-Abstraktion
- Die Klasse
GfxDevice kapselt Vulkan-Funktionen und übernimmt unter anderem die Initialisierung des Vulkan-Kontexts sowie die Erstellung und Verwaltung der Swapchain.
Shader-Verarbeitung
- Shader werden mit GLSL geschrieben.
- Shader werden im Build-Schritt vorab kompiliert, um Laufzeitabhängigkeiten zu reduzieren.
Push Constants, Descriptor Sets und Bindless Descriptors
- In Vulkan werden Descriptor Sets verwendet, um Daten an Shader zu übergeben.
- Durch Bindless Descriptors und Buffer Device Address wird die Nutzung von Descriptor Sets minimiert.
Pipeline-Muster
- Pipeline-Klassen werden verwendet, um die Drawing-Phasen voneinander zu trennen.
- Über die Methoden
init, cleanup und draw werden Initialisierung, Bereinigung und Drawing der Pipeline abgewickelt.
Einsatz von Programmable Vertex Pulling (PVP) + Buffer Device Address (BDA)
- Vertex-Typen werden auf einen einzigen Typ vereinheitlicht, und Shader greifen direkt auf Vertices zu.
- Buffer-Adressen werden über Push Constants übergeben.
Bindless Descriptors
- Texturen werden bindless verwaltet, sodass Shader direkt darauf zugreifen können.
- Die Texture-ID wird zum Sampling per Push Constants übergeben.
Meinung von GN⁺
- Vulkan bietet hohe Performance und moderne GPU-Funktionen, hat aber anfangs eine steile Lernkurve.
- Es ist sinnvoll, zuerst OpenGL zu lernen und danach auf Vulkan umzusteigen.
- Es gibt zahlreiche Ressourcen zum Lernen von Vulkan, die den Einstieg erleichtern.
- Das Schreiben einer kleinen Game Engine mit Vulkan hilft dabei, Grafikprogrammierung tiefgehend zu verstehen.
- Um die Komplexität von Vulkan zu reduzieren, ist der Einsatz nützlicher Bibliotheken empfehlenswert.
1 Kommentare
Hacker-News-Meinung
Zusammenfassung der Hacker-News-Kommentare
Wirkung eines minimalistischen Ansatzes: Ein Metaverse-Client wird in Rust geschrieben, wobei Vulkan, WGPU und Rend3 verwendet werden und dabei komplexe Probleme auftreten. WGPU ist schwer zu entwickeln, weil es viele verschiedene Plattformen unterstützen will.
Vorteile von Vulkan und die Einfachheit von OpenGL: Vulkan kann erweiterte GPU-Funktionen maximal ausnutzen, während OpenGL für einfache 2D-/Low-Poly-Spiele geeignet ist. Die AAA-Spielindustrie konzentriert sich auf Grafikqualität, aber viele Spieler interessieren sich stärker für das Gameplay.
Nur notwendige Funktionen implementieren: Junior-Programmierer neigen dazu, an neuesten Tools und „Best Practices“ festzuhalten, aber wichtig ist, sich auf die minimalen Funktionen zu konzentrieren, die zur Lösung des eigentlichen Problems nötig sind.
Die Komplexität von Vulkan: Im Vergleich zu OpenGL ist Vulkan schwerer zu optimieren und erfordert viel Code sowie viel Synchronisationsarbeit. Für Hobbyprojekte ist OpenGL ES3 einfacher.
Probleme zusätzlicher Abstraktionsschichten: Lernmaterialien zu Vulkan führen zusätzliche Abstraktionsschichten ein, wodurch sich nur schwer grundlegende Beispiele zur Speicherverwaltung finden lassen.
Die Schwierigkeit, Vulkan zu lernen: OpenGL war leicht zu lernen, aber Vulkan macht selbst einfache Aufgaben kompliziert. Das Erlernen neuer Technologien kostet viel Zeit.
Vulkan lernen für wissenschaftliche Datenvisualisierung: Jemand hat Vulkan gelernt und damit eine Engine für wissenschaftliche Datenvisualisierung geschrieben, wobei es viel Zeit kostete, die vielen Abstraktionen im Lernprozess zu verstehen.
Schwierigkeiten beim Lernen von Vulkan: Es ist schwer zu verstehen, wie Vulkan in einer echten Engine verwendet wird. Es werden mehr Materialien benötigt, um gute Abstraktionen und die Entscheidung über die Rendering-Reihenfolge zu lernen.
Unterstützung durch die Grafikprogrammierungs-Community: Bei der Entwicklung einer Vulkan-Engine sind Unterstützung und Feedback aus der Community eine große Hilfe.