3 Punkte von GN⁺ 2024-06-07 | 1 Kommentare | Auf WhatsApp teilen

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

 
GN⁺ 2024-06-07
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.