Monthly Archives: January 2013

C++/DirectX 11 – 48h Deferred Rendering Engine

Pendant la Global Game Jam j’ai codé un début de moteur deferred en C++/DX11 (donc c’était plus une global “tech” jam) pour me familiariser avec cette API. Seules les lumières directionnelles sont implémentées à l’heure actuelle.
Il y a encore beaucoup de choses à implémenter et a nettoyer, mais je travaille toujours dessus, et compte en faire un moteur de voxels.

Le code source est disponible sur GitHub.

 

During the Global Game Jam I coded a deferred engine in C + + / DX11 (so it was more of a global “tech” jam) to get familiar with this API. Only directional lights are working right now.
There are still many things to implement and clean, but I’m still working on it, trying to make a voxel engine.

Source code is available here.

c++ Deferred Rendering

GPU Particles

English version is coming soon !

Une première vidéo pour montrer et expliquer le fonctionnement de base de mon moteur de particules.

Tous les calculs de mise à jour, physique et collisions s’exécutent sur le GPU, ce qui permet d’avoir de bonnes performances pour un grand nombre de particules (ici 1 000 000 de particules, locké à 30 fps pour les besoin de l’enregistrement).

Toutes les informations dynamiques des particules (position X et Y dans les canaux RG et velocité X et Y dans les canaux BA) sont stockées dans une texture (ici 1024×1024) Chaque particule est identifié par un ensemble de trois vertices. A la place de leur position est stocké une coordonnée de texture, qui permet de retrouvé les informations dans la texture contenant les données.

La mise à jour se déroule en deux temps. Tout d’abord il y a une phase de mise à jour de la physique. En dessinant un quad fullscreen, pour chaque pixel de la texture de données on extrait les informations de la frame précédente afin d’en déduire celles de la frame courante, en fonction de la gravité, des collisions, des forces externes, etc. Ensuite vient la phase d’affichage. On envoie à la carte les vertices représentant chaque particule, et dans le vertex shader, grâce au Vertex Texture Fetching et aux UVs, on retrouve la position réelle ce qui permet d’afficher un triangle au bon endroit.

On peut voir dans la vidéo l’influence d’une force d’attraction contrôlée par la souris et celle de la gravité. Il n’y a de collisions qu’avec le bord de l’écran. La couleur des particules peut être soit fixe, soit influencée par leur vélocité. On voit aussi un post process qui dessine une couleur en fonction de la densité des particules, donnant un aspect “fluide”.

Dans la prochaine vidéo je montrerai les collisions avec des objets dynamiques, ainsi que l’utilisation de flowmaps pour influencer le mouvement de toutes les particules.

Le code source est disponible sur github.

Le setup du projet est téléchargeable ici.