Bonjour à tous,
Ça fait un certain temps que je ne suis plus venu par ici, mais peut-être que certains vieux briscards parmi vous se souvienne d'Holyspirit que je développais il y a quelques années. Plus récemment (il y a 6 ans quand-même ), j'avais commencé à travailler sur un début de 2.5D shading engine (i.e. utilisation d'asset 3D prérendu old-school en utilisant des techniques d'éclairage modernes) avec la SFML et OpenGL, en C++, qui ressemblait à quelque chose comme ça:
Puis j'ai été fort pris par mes études, tout ça. Cependant, la nostalgie du développement de jeux me touchant de plus en plus, j'ai décidé de m'y remettre. Et pour ça, j'ai décidé de commencer d'abord par développer un nouveau moteur d'éclairage 2.5D, toujours avec la SFML. Je suis donc ici pour vous en parler, vous montrer un peu ce que je bricole et si possible avoir des retours et idées pour améliorer tout ça. Je compte aussi me servir de ce topic un peu comme un blog de développement, expliquant dans différents messages les techniques que j'ai mises en place pour arriver au résultat (n'hésitez pas à me demander l'un ou l'autre point que vous auriez envie que j'explique plus en détails! ). En parlant de résultat, pour le moment, ça ressemble à ça:
Fiche technique
- C++
- SFML/OpenGL
- Deferred Rendering
- PBR shading
- Isometric/2.5D assets
Concept de base
L'idée est très simple (et pas original : il y a plusieurs exemples sur youtube, sinon Pillars of Eternity utilise un concept similaire) : beaucoup de moteurs de rendus 3D utilise une technique qu'on appelle "Deferred shading" qui consiste à reporter le plus loin possible le calcul de l'éclairage de la scène. Concrètement, ça se fait en rendant toute la géométrie de la scène dans différents buffers qui contiennent l'information des fragments (i.e. pixels à l'écran): leur couleur diffuse, l'orientation de la surface, le matériau et la position dans la scène. Ensuite, basé sur ces informations là, le shader d'éclairage calcule l'illumination de chaque pixel affiché à l'écran. Le gros avantage de cette technique est que le calcul d'éclairage n'a besoin de ce faire qu'une seule fois par pixel, au lieux d'une fois par pixel par objet (on n'a pas besoin de calculer l'éclairage d'un pixel caché par un autre objet, en gros). Je vous invite à consulter ce tutoriel pour plus d'explications.
Et maintenant, tout ce qu'il nous reste à faire c'est mélanger ces techniques d'éclairage avec des objets high-poly prérendus, où au lieu de prérendre un modèle déjà éclairé, on pré-rend les 4 passes (couleur, orientation, matériaux, hauteur). Par exemple:
Et donc dans la scène:
Albedo:
Normal:
Heightmap:
Material:
+ encore des passes pour le bloom, SSAO, shadows maps, etc.
Ce que le moteur fait actuellement
- Calcul de la géométrie de la scène en tenant compte de la heightmap pour calculer l'intersection d'objets 2.5D en temps réel.
- Éclairage de la scène en utilisant des techniques PBR (i.e. Physically Based Rendering).
- Calcul de projection d'ombres pour lumière directionnel (type soleil) basé sur la géométrie visible.
- Calcul de projection d'ombres dynamiques pour lumières omnidirectionnelles en utilisant de la géométrie 3D basique invisible ajoutée à la scène (j'expliquerai ça dans un post à part).
- SSAO
- Bloom
La suite à court terme
Il reste encore beaucoup de travail pour améliorer l'architecture globale du moteur, ajouter des fonctionnalités de base et surtout l'optimisation (j'ai déjà des idées que je vais implémenter sous peu, je vous tiens au courant). Je compte aussi ajouter bien évidemment des objets animés. Ensuite, je voudrais aussi développer un shader pour rendre l'eau, avec si possible détection de la géométrie pour ajouter de la mousse. Je voudrais aussi ajouter la possibilité de faire de la pluie, qui humidifierait les zones exposées (ça devrait être facile en utilisant la même technologie que pour la projection des ombres directionnelles et changer les propriétés de type "matériau" du fragment exposé).
La suite à long terme
Utiliser le moteur pour un projet de jeu indie open-source (non pas Holyspirit 2 ). Mais je ne me sens pas encore prêt à communiquer plus là-dessus.
Et les sources dans tout ça ?
Pour le moment, je préfère ne pas trop les distribuer car beaucoup de choses sont encore trop brouillonnes je pense. Cependant, je peux vous les envoyer sur demande. ;-p
Partager