Table des matières
- Préface
- Apprendre la programmation graphique
- Ne pas s’obséder sur des problèmes mineurs
- Pourquoi Vulkan ?
- Apprendre Vulkan
- Vue d’ensemble du moteur et analyse d’une frame
- Conseils généraux
- Bibliothèques Vulkan recommandées
- Abstraction
GfxDevice
- Gestion des shaders
- Push constants, descriptor sets et bindless descriptors
- Modèle de pipeline
- Utilisation du programmable vertex pulling (PVP) + buffer device address (BDA)
- Bindless descriptors
- Gestion des données dynamiques à téléverser à chaque frame
- Destructeurs, file de suppression et nettoyage
- Synchronisation
- Notes d’implémentation supplémentaires
- Dessiner beaucoup de sprites
- Compute skinning
- Séparation jeu / renderer
- Chargement de scène et prefabs d’entités
- MSAA
- UI
- Dear ImGui et problèmes de sRGB
- Divers
- Ce que la transition vers Vulkan a apporté
- Travaux futurs
Préface
- Il s’agit d’un document sur l’expérience d’apprentissage de Vulkan et d’écriture d’un petit moteur de jeu.
- Le travail a duré 3 mois, sans connaissance préalable de Vulkan.
- Un petit jeu 3D a été créé, et les parties réutilisables ont été séparées dans le moteur.
Apprendre la programmation graphique
- Pour quelqu’un qui débute en programmation graphique, il est recommandé de commencer par OpenGL.
- Il est utile d’apprendre avec OpenGL à afficher un modèle texturé à l’écran, ainsi qu’un éclairage simple et le shadow mapping.
- Ressources recommandées pour apprendre OpenGL :
- learnopengl.com
- le livre Anton’s OpenGL 4 Tutorials
- les cours de Thorsten Thormählen (les 6 premières vidéos sont recommandées)
Ne pas s’obséder sur des problèmes mineurs
- Il faut veiller à ne pas s’obséder sur des problèmes mineurs.
- Il faut toujours se demander : « Est-ce vraiment nécessaire ? », « Est-ce que cela deviendra un goulot d’étranglement ? ».
- Les fonctionnalités non nécessaires peuvent être ajoutées plus tard.
- Il vaut mieux commencer par un jeu simple et éviter de créer un moteur complexe.
Pourquoi Vulkan ?
- Vulkan permet d’utiliser des fonctionnalités GPU modernes et convient à ceux qui préfèrent les technologies open source et les standards ouverts.
- OpenGL est suffisant pour de petits jeux, mais il est difficile d’y exploiter les fonctionnalités GPU modernes, et son usage est limité sur macOS.
- WebGPU est plus facile à apprendre que Vulkan et permet d’exécuter des jeux dans le navigateur.
Apprendre Vulkan
- Au début, apprendre Vulkan semblait difficile, mais cela est devenu plus simple grâce à Khronos, qui a simplifié les parties complexes et fourni des bibliothèques utiles.
- Ressources recommandées pour apprendre Vulkan :
- vkguide
- la série de cours Vulkan de TU Wien
- le livre 3D Graphics Rendering Cookbook
- le livre Mastering Graphics Programming with Vulkan
Vue d’ensemble du moteur et analyse d’une frame
- Le moteur s’appelle EDBR (Elias Daler’s Bikeshed Engine) et a commencé comme projet d’apprentissage de Vulkan.
- Le moteur convient principalement aux petits jeux basés sur des niveaux.
- Processus de rendu d’une frame :
- Skinning : traitement du skinning de modèles via un compute shader
- Shadow mapping : utilisation d’une texture de profondeur 4096x4096
- Géométrie et shading : utilisation d’un modèle PBR
- Résolution de profondeur : traitement manuel via le fragment shader
- Effets de post-traitement : application de brouillard de profondeur, tone mapping et bloom
- UI : rendu de l’UI en un seul draw call
Conseils généraux
Bibliothèques Vulkan recommandées
- vk-bootstrap : simplifie le code d’initialisation Vulkan
- Vulkan Memory Allocator (VMA) : gère l’allocation mémoire
- volk : simplifie le chargement des fonctions d’extension
Abstraction GfxDevice
- La classe
GfxDevice encapsule les fonctionnalités Vulkan et gère notamment l’initialisation du contexte Vulkan, la création de la swapchain et sa gestion.
Gestion des shaders
- Les shaders sont écrits en GLSL.
- Les shaders sont précompilés à l’étape de build afin de réduire les dépendances à l’exécution.
Push constants, descriptor sets et bindless descriptors
- Dans Vulkan, les descriptor sets sont utilisés pour transmettre des données aux shaders.
- L’usage des descriptor sets est minimisé grâce aux bindless descriptors et aux buffer device addresses.
Modèle de pipeline
- Des classes de pipeline sont utilisées pour séparer les étapes de rendu.
- Les méthodes
init, cleanup et draw gèrent respectivement l’initialisation, le nettoyage et le rendu du pipeline.
Utilisation du programmable vertex pulling (PVP) + buffer device address (BDA)
- Un type de vertex unique est utilisé, et les shaders accèdent directement aux vertex.
- Les adresses de buffer sont transmises via des push constants.
Bindless descriptors
- Les textures sont gérées de manière bindless afin de permettre un accès direct depuis les shaders.
- L’échantillonnage se fait en transmettant l’ID de texture via des push constants.
Avis de GN⁺
- Vulkan offre de hautes performances et des fonctionnalités GPU modernes, mais la courbe d’apprentissage initiale est raide.
- Il est recommandé d’apprendre OpenGL d’abord, puis de passer à Vulkan.
- Il existe diverses ressources pour apprendre Vulkan, et leur utilisation facilite l’apprentissage.
- Écrire un petit moteur de jeu avec Vulkan aide à comprendre en profondeur la programmation graphique.
- Il est recommandé d’utiliser des bibliothèques utiles pour réduire la complexité de Vulkan.
1 commentaires
Avis sur Hacker News
Résumé des commentaires Hacker News
Effet d'une approche minimaliste : un client de métavers est en cours d'écriture en Rust, avec Vulkan, WGPU et Rend3, et cela entraîne des problèmes complexes. WGPU est difficile à développer car il cherche à prendre en charge de nombreuses plateformes.
Les atouts de Vulkan et la simplicité d'OpenGL : Vulkan permet d'exploiter au maximum les fonctionnalités avancées du GPU, tandis qu'OpenGL convient bien aux jeux 2D simples ou low-poly. L'industrie du jeu AAA met l'accent sur la qualité graphique, mais beaucoup de joueurs s'intéressent davantage au gameplay.
Implémenter uniquement les fonctionnalités nécessaires : les programmeurs juniors ont tendance à s'accrocher aux outils les plus récents et aux « best practices », mais il est important de se concentrer sur le minimum nécessaire pour résoudre le problème réel.
La complexité de Vulkan : par rapport à OpenGL, Vulkan est plus difficile à optimiser en termes de performances et demande beaucoup de code ainsi qu'un important travail de synchronisation. Pour un projet amateur, OpenGL ES3 est plus pratique.
Le problème des couches d'abstraction supplémentaires : les ressources pour apprendre Vulkan introduisent souvent des couches d'abstraction en plus, ce qui rend difficile la recherche d'exemples de base sur la gestion mémoire.
Les difficultés d'apprentissage de Vulkan : OpenGL était facile à apprendre, mais Vulkan complique même les tâches simples. Apprendre une nouvelle technologie demande beaucoup de temps.
Apprendre Vulkan pour la visualisation de données scientifiques : Vulkan a été appris pour écrire un moteur de visualisation de données scientifiques, et il a fallu du temps pour comprendre les nombreuses abstractions pendant l'apprentissage.
La difficulté d'apprendre Vulkan : il est difficile de comprendre comment utiliser Vulkan dans un vrai moteur. Il faudrait davantage de ressources pour apprendre à définir de bonnes abstractions et l'ordre de rendu.
Le soutien de la communauté de programmation graphique : lors du développement d'un moteur Vulkan, l'aide et les retours de la communauté ont été d'un grand soutien.