3 points par GN⁺ 2024-06-07 | 1 commentaires | Partager sur WhatsApp

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

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