72 lines
4.1 KiB
Markdown
72 lines
4.1 KiB
Markdown
# Informatikprojekt: Performancevergleich eines Partikelsystem umgesetzt mit OpenGL und Vulkan
|
|
## Informationen
|
|
Autor: Niklas Birk\
|
|
Betreuer: Prof. Dr. Daniel Scherzer\
|
|
Fach: Informatikprojekt
|
|
|
|
## Paper
|
|
Die schriftliche Ausarbeitung des Themas ist in [Informatikprojekt (PDF)](Informatikprojekt_release_01042020.pdf) zu finden.
|
|
In dieser Arbeit wird eine Einführung in Partikelsysteme und Grafik-APIs beschrieben. Anschließend wird die Implementierung des Projektes beschrieben. Die Implementierung wird benötigt, um einen Performancevergleich durchzuführen. Das ist der wissenschaftlichere Teil dieser Arbeit und ist als letzten Teil zu finden.
|
|
|
|
## Projektdateien
|
|
Das Projekt enthält im wesentlichen drei Varianten:
|
|
- CPU
|
|
- OpenGL
|
|
- Vulkan
|
|
|
|
Der Name bezieht sich hierbei auf Art der Simulation der Partikel.
|
|
Die CPU-Variante simuliert die Partikel auf der CPU,
|
|
während die anderen beiden Varianten sich die Compute-Funktionalitäten der
|
|
jeweiligen Grafik-API zu nutze machen.\
|
|
Bei der CPU- und OpenGL-Variante wird OpenGL zum rendern benutzt und
|
|
bei der Vulkan-Variante entsprechend Vulkan.
|
|
|
|
### CPU-Variante
|
|
Zur CPU-Variante gehören folgende Dateien:
|
|
- [cpuMain.c](cpuMain.c): Enthält die main-Funktion
|
|
- ( [initOpenGL.c](initOpenGL.c): Enthält wesentliches zum initialiseren von OpenGL )
|
|
- ( [initOpenGL.h](initOpenGL.h): Header-Datei zu [initOpenGL.c](initOpenGL.c) )
|
|
|
|
### OpenGL-Variante
|
|
Zur OpenGL-Variante gehören folgende Dateien:
|
|
- [openglMain.c](openglMain.c): Enthält die main-Funktion
|
|
- [initOpenGL.c](initOpenGL.c): Enthält wesentliches zum initialiseren von OpenGL
|
|
- [initOpenGL.h](initOpenGL.h): Header-Datei zu [initOpenGL.c](initOpenGL.c)
|
|
- [ComputeShader.glsl](shaders/opengl/ComputeShader.glsl): Der Compute-Shader für OpenGL
|
|
- [VertexShader.glsl](shaders/opengl/VertexShader.glsl): Der Vertex-Shader für OpenGL
|
|
- [FragmentShader.glsl](shaders/opengl/FragmentShader.glsl): Der Fragment-Shader für OpenGL
|
|
|
|
### Vulkan-Variante
|
|
Zur OpenGL-Variante gehören folgende Dateien:
|
|
- [vulkanMain.c](vulkanMain.c): Enthält die main-Funktion
|
|
- [initVulkan.c](initVulkan.c): Enthält wesentliches zum initialiseren von Vulkan
|
|
- [initVulkan.h](initVulkan.h): Header-Datei zu [initVulkan.c](initVulkan.c)
|
|
- [ComputeShader.comp](shaders/vulkan/ComputeShader.comp): Der Compute-Shader für Vulkan in GLSL
|
|
- [VertexShader.frag](shaders/vulkan/VertexShader.vert): Der Vertex-Shader für Vulkan in GLSL
|
|
- [FragmentShader.vert](shaders/vulkan/FragmentShader.frag): Der Fragment-Shader für Vulkan in GLSL
|
|
- [runCompiler.sh](shaders/vulkan/runCompiler.sh): Ein Shell-Script zum Übersetzen der Shader in SPIR-V.\
|
|
Cmake sollte sich automatisch um das kopieren der Dateien und Ausführen des Shell-Skripts im Zielverzeichnis kümmern.
|
|
|
|
### Partikelsystem und Sonstige
|
|
Für das Partikelsystem sind folgende Dateien vorhanden:
|
|
- [particlesystem.c](particlesystem.c): Enthält wesentliche Funktionen zum Erstellen eines Partikelsystems
|
|
- [particlesystem.h](particlesystem.h): Header-Datei zu [particlesystem.c](particlesystem.c)
|
|
- [utils.c](utils.c): Enthält eine kleine Hilfsfunktion zum Lesen von Dateien.
|
|
- [utils.h](utils.h): Header-Datei zu [utils.c](utils.c) und enthält #define für wichtige Konstanten
|
|
|
|
## Ausführung
|
|
Cmake erstellt drei Ziele:
|
|
- Informatikprojekt: Die CPU-Variante
|
|
- Informatikprojekt_OpenGL: Die OpenGL-Variante
|
|
- Informatikprojekt_Vulkan: Die Vulkan-Variante
|
|
|
|
Die Compute-Shader sehen aktuell eine Workgroupgröße von x=1024, y=1 und z=1 vor.\
|
|
Sollte dies Ihr System nicht zulassen, dann kann das entsprechend in den Shadern geändert werden.
|
|
Bitte aber auch die Dispatch-Anweisungen anpassen.
|
|
|
|
Die maximale Anzahl der Partikel ist durch die Dispatch-Anweisungen bzw. die maximale Anzahl an Gruppen beschränkt.
|
|
Bei meinem System waren es etwas mehr 60 Millionen Partikel.
|
|
Bei 60 Millionen Partikeln gibt es knapp 60 Tausend Arbeitsgruppen, bei meinem System ist die maximale Anzahl 65536.
|
|
Sollte also die Ausführung nichts anzeigen, dann kann es sein, dass Sie die Lokale X Größe anpassen müssen.
|
|
(Anmerkung: Für Partikelanzahl < 1024 sind es zu wenige Gruppen (0), die der Dispatch-Anweisung mit gegeben werden).
|