Work

Moteur Custom Vulkan

Dev
Math
Vulkan
Team

Nous avons recréer un moteur 3D via la bibliothèque Vukan

Demo de la physique du moteur via la colision de Cubes

Un moteur personnalisé

Pourrquoi ce projet?

  • Apprentissage approfondi de la programmation graphique: Développer un moteur de rendu avec Vulkan offre une opportunité d’approfondir ses connaissances en programmation graphique. Vulkan est une API graphique bas niveau qui nécessite une compréhension approfondie du fonctionnement du pipeline graphique et des concepts avancés de rendu.

  • Contrôle total sur le rendu graphique: En développant un moteur de rendu personnalisé, l’étudiant peut avoir un contrôle total sur le processus de rendu graphique. Cela lui permet d’expérimenter et d’implémenter des techniques de rendu avancées selon ses propres besoins et objectifs d’apprentissage.

  • Performance optimale: Vulkan est conçu pour offrir de hautes performances en exploitant pleinement les capacités du matériel graphique. En développant un moteur avec Vulkan, l’étudiant peut apprendre à optimiser les performances du rendu graphique pour des applications exigeantes, telles que les jeux vidéo ou la réalité virtuelle.

  • Portabilité: Vulkan est conçu pour être une API graphique multiplateforme, ce qui signifie que le moteur de rendu développé avec Vulkan peut être porté facilement sur différentes plateformes, y compris Windows, Linux, Android et d’autres.

  • Opportunités professionnelles: La maîtrise de Vulkan et du développement de moteurs de rendu personnalisés peut offrir des opportunités professionnelles dans l’industrie des jeux vidéo, de la réalité virtuelle, de la simulation, de la visualisation 3D et d’autres domaines liés à la programmation graphique.

Fonctionnement

Configuration du pipeline

La première étape, la plus difficile et la plus importante, consistait à configurer le pipeline graphique pour Vulkan.

La mise en place du pipeline dans un projet Vulkan implique la configuration du pipeline graphique, qui est un aspect clé du rendu dans Vulkan. Le pipeline graphique définit les étapes par lesquelles les données passent pour être traitées et rendues sur le GPU. La mise en place du pipeline dans Vulkan nécessite une configuration minutieuse de ces étapes afin d’obtenir le comportement de rendu souhaité. Chaque étape implique de spécifier comment le GPU doit traiter et rendre les données d’entrée.

L’image de droite montre les processus par lesquels le GPU doit passer pour effectuer le rendu des graphiques.

Traduit avec DeepL.com (version gratuite)

Pipeline

Rendu 2D

Pour cette étape, l’accent a été mis sur le rendu d’objets plats en deux dimensions à l’aide d’une projection orthographique. Il s’agissait de préparer les ressources nécessaires, de configurer le pipeline graphique et d’émettre des commandes de dessin.

Pour le rendu 2D, j’ai utilisé deux shaders, un pour les sommets et un autre pour les fragments.

Rendu 2D

Rendu 3D

L’accent est mis ici sur la création de scènes immersives en trois dimensions. Cela implique la manipulation de modèles 3D et la mise en place de projections réalistes. Les étapes comprennent la configuration du pipeline graphique, l’enregistrement des tampons de commande et la présentation des images pour obtenir une expérience 3D visuellement convaincante dans une application Vulkan.

Grâce à cette étape, j’ai appris comment la perspective et le frustum fonctionnent dans les jeux pour configurer une caméra à perspective correcte.

Cubes 3D

Transformation, échelle, rotation et collision

L’étape suivante consistait à gérer les modifications des objets 3D. En utilisant des matrices et en comprenant leur fonctionnement, nous pouvons appliquer des transformations sur la taille, l’orientation ou la position des modèles 3D.

De plus, nous avons implémenté des algorithmes pour détecter les collisions, en utilisant des boîtes de délimitation alignées sur les axes (AABB) et des hitboxes sphériques.

Collision de cubes

Importation de modèles 3D

Après avoir mis en place le composant de transformation des modèles 3D, nous avons ajouté la possibilité d’importer n’importe quel fichier obj dans notre moteur. Pour cela, nous avons utilisé la bibliothèque tinyobjloader.

Le défi ici était de mettre à l’échelle les implémentations précédentes pour qu’elles fonctionnent correctement avec n’importe quel objet 3D.

Comme le système de coordonnées de Vulkan n’est pas le système habituel, les fichiers obj doivent être exportés avec -Y pour l’axe ascendant et Z pour l’axe descendant.

Importation de modèles 3D

Éclairage, alpha blending et transparence

L’ajout suivant a été l’éclairage directionnel, qui peut simuler le soleil. le soleil. Ce type d’éclairage illumine uniformément tout point touché par un rayon lumineux, tous les rayons étant considérés comme parallèles, la source de lumière étant considérée comme infiniment éloignée du point touché.

Par la suite, des “lumières ponctuelles” ont été introduites en tant que sources de lumière plus petites et non parallèles. Ces lumières sont réglables en intensité et en rayon. Nous avons opté pour des calculs d’éclairage réalistes, limitant le nombre de lumières mais améliorant considérablement la qualité graphique. Les objets ont une intensité de réflexion personnalisable, permettant des effets tels que l’augmentation de la luminosité sur les surfaces métalliques.

Des fonctionnalités d’alpha blending et de transparence ont été implémentées pour servir des objectifs tels que le rendu du verre ou des miroirs.

Lights

Interface utilisateur

Pour l’interface utilisateur, nous avons utilisé la bibliothèque ImGui. En nous inspirant de l’interface Unity, nous avons créé un inspecteur qui présente les composants de notre objet sur la droite et notre hiérarchie sur la gauche.

Le gif de droite montre l’implémentation de l’interface utilisateur du composant “Transform” pour un objet 3D.

Interface