Re: hARMful engine

Posté par Bibi09 le 15/2/2020 18:18:39
Coucou,
Un petit point sur les avancements !

J'ai pris un peu de retard par rapport aux prévisions. D'une part parce que j'ai fait une "bêtise" : j'ai voulu ajouter le support de l'anti-aliasing !
De l'autre, un incendie a eu lieu dans ma résidence et ça a foutu la pagaille ! Heureusement, pas de dégâts chez moi.

Ce que je ne savais pas avec l'anti-aliasing - car j'ai exploré un domaine que je ne connaissais pas du tout - c'est que ça allait changer énormément de choses dans le code ! J'ai dû faire un beau refactoring ("réusinage" pour nos amis québécois).
Cela m'a demandé en fait de revoir la partie du rendu, en particulier "à cause" de l'ambient occlusion. C'est un mal pour un bien car ce travail devait être fait, je le prévoyais pour plus tard lorsque j'allais implémenter des effets de post-production. Au final, l'ajout d'effets de post-prod sera nettement simplifié !

La suite sera une amélioration du code sans ajouts notables côté rendu. En particulier, je vais m'attacher à utiliser les smart pointers de C++ pour faciliter la gestion de la mémoire.
J'ai aussi quelques bugs à corriger avant de passer au support de Windows.

Le plan de développement est ici !
https://github.com/dcarlus/hARMful/projects/5



Si vous êtes intéressés par les détails techniques, voici une petite explication.

Je fais mes rendus hors écran, dans des framebuffers, pour réaliser du "deferred shading"*. Un framebuffer est comme un ensemble de textures dans lesquelles on vient écrire les valeurs de pixels à l'aide de shaders. Un framebuffer peut contenir plusieurs images en couleur en plus d'un depth buffer et d'un stencil buffer.
Dans mon cas, je stocke l'albedo des objets (= couleur/texture), les normals, la spécularité et la profondeur des objets (depth buffer).

Pour l'ambient occlusion, je stockais auparavant sa valeur dans le canal alpha de l'albedo pour un côté pratique et optimisé.

Le souci avec l'anti-aliasing, c'est que j'ai dû modifier le type de mes framebuffers afin que ceux-ci supportent le multisampling (comme l'option MSAA des jeux vidéo). Quand on utilise un framebuffer en multisampling, toutes les textures qui le composent doivent elles-mêmes être aptes à supporter le multisampling. Ainsi, mon ambient occlusion était calculée plusieurs fois par le GPU pour chaque sample. Par exemple, pour un MSAA x4, elle est calculée 4 fois. Pire encore, une texture avec multisampling occupe plus d'espace puisqu'il faut autant de copies qu'il y a de samples (dans l'exemple, 4 copies). Mais l'ambient occlusion n'a pas besoin d'antialiasing car elle est déjà floutée dans le processus de traitement.

J'ai donc dû faire beaucoup de changements pour avoir d'un côté mon framebuffer avec MSAA. J'ai ensuite précalculé le shading en appliquant le MSAA dans un autre framebuffer sans multisampling (!). Ce framebuffer me sert également pour les effets de post-prod dont l'ambient occlusion.

Ouf !!


J'ai acheté le humble bundle d'objets 3D à 1€ pour faire des scènes de démo, ici la scène de démo du pack.


* Le deferred shading, c'est une façon qui est très répandue dans les jeux vidéo pour optimiser le calcul des lumières (il existe des alternatives). Au lieu de calculer l'ombrage pour chaque objet, on ne le fait que globalement pour uniquement ce qui est visible à l'écran.
https://fr.wikipedia.org/wiki/Deferred_Shading

Cette contribution était de : http://blenderclan.tuxfamily.org/html/newbb/viewtopic.php?forum=3&topic_id=49507&post_id=580996