Author Topic: System de particules et Mesh  (Read 7041 times)

0 Members and 1 Guest are viewing this topic.

Offline dj_himp

  • Base
    • View Profile
  • Rôle: code
  • Ville: Montreuil
System de particules et Mesh
« on: 27 January 2012 à 01:16:56 »
Bonsoir à tous,

Je débute dans le demo making (mais pas en prog rassurez vous), et j'aimerai savoir si quelqu'un aurais une idée pour émettre des particules à partir d'un mesh ou d'une scène existante (rendu par du raymarching par exemple) un peu comme cette demo : http://www.pouet.net/prod.php?which=54603

Bien sur je n'ai pas la prétention d'arriver à ce résultat mais au moins comprendre le principe ne serait-ce que pour afficher du texte en particule ou des scènes simples que je pourrais faire "exploser" ou "souffler".

Pour l'instant ce que j'ai testé c'est de rendre une scène simple en raymarching sur la première frame, en sortant dans des render targets la position et la couleur de l'objet .
Après je crée mes particules en fonction de ces render targets et je lance un rendu de particule classique.

Le premier problème est que pour une scène plus lourde on doit générer beaucoup de particules.
Un autre problème est que l'on ne peut pas avoir de changement de caméra car seule ce qui est visible à la première frame (celle faite en raymarching dans mon exemple) génère des particules.

Pour finir une question subsidiaire mais qui je pense est liée à la première : comment rendre un mesh "attracteur" de particule?

Merci bien!!

Offline xoofx

  • Base
    • Pouet.net
    • View Profile
    • xoofx
  • Ancienneté: 1989
  • Groupe: FRequency
  • Rôle: code (+musique), web
  • Ville: Grenoble
Re : System de particules et Mesh
« Reply #1 on: 27 January 2012 à 02:09:16 »
Ouaou, un gars de Montreuil, mais c'est que j'habitais a Montreuil il y a encore tout juste 6 mois, on aurrait pu faire des demos ensembles!  ;D

Sinon, pour repondre a ta question... arf, j'ai pas trop saisi ta première frame que tu rends en raymarching...

Le principe général est de faire un premier rendu d'un mesh classique (avec des triangles), via un draw classique dans une render target... mais dans le vertex shader, au lieu de faire une projection de la position a partir des positions des vertex, on utilise les coordonnés UV assignés a chaque vertex qui ont été préalablement mappés sur une texture 2D via un outil 3D (regarde par exemple la doc de blender a propos de "UV Mapping a Mesh" ou encore "Basics of Creating UV Maps"). La seule condition lorsque tu bosses sous un outil 3D qui fait le mesh mapping est de generer des UV qui ne s'overlappent pas (c'est a dire, que chaque face de ton mesh occupera bien un espace dédié dans une texture 2D).

Donc dans cette première phase, tu t'appliques juste a mapper un mesh 3D dans une texture 2D (en stockant toutes les infos dans des render targets, position du point 3D source, normals, couleurs...etc.), sachant que pour pas t’embêter, des outils d'UV mapping existent deja dans les outils 3D (c'est la partie la plus complexe a faire, smash a je crois fait sa propre routine d'UV mapping, mais t'as pas besoin d'aller jusque la dans un premier temps). Tu n'as besoin de faire cela qu'une seule fois a l'initialisation du programme (sauf si tu deformes ton mesh en temps reel en t'appuyant sur les vertex d'origines, mais je pense pas que ce soit intéressant une fois que l'on passe en particules).

Ensuite, tu fais un bête rendu de particules en t'appuyant sur le buffer du mesh 2D, qui contient les positions 3D des points du mesh, en fetchant les coordonnees des points dans un vertex shader et en appliquant les rotations 3D, noises&déformations_a_gogo! En Direct3D10+ tu utilises un Draw de points en utilisant SV_VertexID (c'est a dire, sans instancier un vertex buffer. Tu as juste besoin de recuperer les points contenus dans la texture 2D du mesh, donc on utilise pour cela un id generique qui peut etre genere en entree du vertex shader). Ensuite, tu as souvent un pass de GeometryShaders pour instancier des quads de particules (encore une fois, si tu bosses en Shader Profile 4.0 ou 5.0, Direct3D10+).

Après tu peux faire un peu ce que tu veux avec ces coordonnées. Si tu as 2 mesh différent, tu auras 2 buffers, et tu pourras même faire du morphing entre les 2 texture 2D (chaque point va se transformer vers un point de l'autre mesh, via une interpolation ou autres trajectoires...etc.).

Pour Agenda Circling Forth (j'imagine que tu as lu l'article de son blog ainsi que son article initial "a thoroughly modern particle system") utilise aussi du Curl Noise pour simuler des fluides de particules... mais le truc le plus embetant dans cette demo, c'est que pour faire un rendu sympa avec bon shading et tout, il doit trier les particules, et ca c'est ptet l'algo le plus penible a faire dans le lot! (comme il dit "5. Sorting. Good shading implies not additive blending, which implies sorting.")

Bon, je sais pas si j'ai été clair... sinon le grand Pédagogue Patapom pourra en remettre une couche avec des exemples et tout! ;)
(D'ailleurs je me rappelle qu'il avait fait un post ici meme a ce sujet et qu'il avait fait un rendu de particules dans son moteur Nuaj)




« Last Edit: 27 January 2012 à 02:42:46 by @lx »

Offline Patapom

  • Base
    • View Profile
    • www.patapom.com
  • Ancienneté: 1988
  • Groupe: Bomb!
  • Rôle: Coder
  • Ville: Lyon
Re : System de particules et Mesh
« Reply #2 on: 27 January 2012 à 03:18:59 »
Gna !

Non j'ai pas grand-chose à rajouter à ton explication @lx, c'est tout très bien. :D

A noter quand même que t'as pas parlé de la possibilité d'émettre des particules en screen-space ! En gros là tu rends une scène avec un deferred rendering classique, même pas besoin de t'emmerder à déplier tes UVs et compagnie. Au final t'as un GBuffer avec couleur et distance (ZBuffer) donc tu peux aisément recréer la position 3D de la particule avec la bonne couleur et vogue la galère...
Bon par contre avec ce système tu n'as pas les backfaces ou les concavités mais c'est déjà sympa.

Je vais quand même montrer un exemple de mesh dont les UVs sont dépliés :


C'est la tête que tout le monde utilise pour faire du subsurface scattering et qu'on peut trouver là : http://www.ir-ltd.net/infinite-3d-head-scan-released.

On voit bien que toutes les parties de la tête sont représentées dans cette texture. Pas de recouvrements, pas de mirroring : chaque triangle est mappé sur un endroit unique de la texture.
Inversement, chaque pixel de la texture est donc mappé sur un triangle unique du mesh.

Tu peux obtenir ce genre de dépliage à partir de n'importe quel mesh en utilisant un plug-in comme Pelting (dépeçage :) ) dans Maya ou Unwrap UV dans MAX.

A partir d'un tel mesh, comme disait @lx, il te "suffit" ensuite de baker les particules dans une texture. La taille de la texture dictera le nombre de particules.
Pour ce faire, il faut rendre le mesh dans la texture en utilisant les UVs des triangles (qui sont uniques comme on l'a dit, pas de recouvrement) comme position dans le clip space.

En gros, généralement dans le vertex shader on fait (en HLSL) :
Out.Position = mul( float4( In.VertexPosition, 1.0 ), ModelViewProj );

Ici au contraire on fait :
Out.Position = float4( 2.0 * In.UV - 1.0, 0.0, 1.0 );

Et dans le pixel shader tu écris (en multiple render targets, car tu as besoin de plusieurs infos):
* Position 3D originale sur le mesh (dans la 1ère render target)
* Couleur (dans la 2nde render target)
* Ce que tu veux... Moi j'écrivais aussi la normale parce que je lightais les particules.

Seule la première render target va évoluer, les suivantes sont des informations fixes. A moins que tu veuilles faire changer la couleur des particules avec leur durée de vie, ce genre de chose.
Il faut bien comprendre que tu ne fais ça qu'une seule fois au départ : tu bakes les particules de ton mesh.
Ensuite, toutes tes particules sont en fait représentées par chaque pixel de tes render targets, et là comme disait @lx, tu vas dessiner N point où chaque point (grâce au SV_VertexID) va aller sampler la texture dans le vertex buffer pour retrouver position, couleur, normale, etc.

Chais pas trop quoi dire d'autre sans paraphraser @lx 36 fois, ce que j'ai déjà fait.
L'idée principale et qu'il faut bien comprendre est que tout se fait dans des render targets : tu animes tes particules en faisant un va-et-vient entre 2 render targets, la première est la source qui contient les positions courantes, la seconde est la destination qui va contenir la nouvelle position. Et là, tout est permis pour calculer l'animation : attraction, vitesse, gravité, curl noise, etc.

Et pour ce qui est de l'attraction des particules vers un mesh, c'est ce qu'@lx disait : tu fais une interpolation de ta position courante avec une position target (une texture contenant les positions des particules sur le mesh attracteur), et tes particules vont tout naturellement aller se coller sur le mesh attracteur.


Chuis un peu fatigué, j'espère que j'ai été clair. Sinon tu as toujours mon code source que tu peux pomper ici : http://wiki.patapom.com/index.php/Nuaj
C'est un peu le bordel en ce moment alors je sais même pas si l'exemple des particules fonctionne encore. Le projet s'appelle "DemoNoiseParticles" en tout cas.
« Last Edit: 27 January 2012 à 03:21:24 by Patapom »
.  Pom  .

Offline dj_himp

  • Base
    • View Profile
  • Rôle: code
  • Ville: Montreuil
Re : System de particules et Mesh
« Reply #3 on: 27 January 2012 à 14:32:22 »
Génial merci beaucoup à tous les deux!! effectivement une fois qu'on a compris le concept c'est relativement évident.
Bon ça ne fonctionne pas encore très bien mais je pense que ça vient surtout de mes particules qui sont codé à l'arrache en xna (oui je sais ce n'est pas le meilleur framework pour de la demo, mais j'aime bien prototyper avec).
Donc maintenant je vais me mettre a DirectX pour repartir sur de bonne bases.

Juste pour valider le baking des particules j'ai mis en pièce jointe la render target de la position.

Je reposterai ici si j'ai d'autre problèmes et je posterai aussi mes avancées.

Encore merci!!

Offline Patapom

  • Base
    • View Profile
    • www.patapom.com
  • Ancienneté: 1988
  • Groupe: Bomb!
  • Rôle: Coder
  • Ville: Lyon
Re : System de particules et Mesh
« Reply #4 on: 27 January 2012 à 14:58:15 »
Oui bah voilà... Bon avec ce que tu as fait, on voit que tu perds plein de place et qu'il y aura plein de particules en dehors du mesh qui seront pas gérées (tu peux mettre leur couleur à "transparent", ou stocker une valeur discriminatoire dans l'alpha genre -1 et faire un clip( Alpha ) pour pas traiter la particule du tout).
Pour un cube tu peux facilement concaténer les 6 faces en une seule texture sans trou. Mais l'idée est là effectivement.

Bon bah plus qu'à poster des images du rendu final ! ;D
.  Pom  .

Offline dj_himp

  • Base
    • View Profile
  • Rôle: code
  • Ville: Montreuil
Re : System de particules et Mesh
« Reply #5 on: 27 January 2012 à 15:06:42 »
Les couleurs en dehors du mesh on déja un alpha à 0 et dans ma création de particule je ne prend que les alpha > 0 (pour l'instant mes particules sont généré sur le CPU avec des bonnes grosses boucles qui remplissent un vertex buffer (oui c'est crade  ;D mais c'est pour le test).
La je suis en train de me faire la main sur directX (car je m'y suis jamais mis encore) comme ça je pourrais faire des particules entièrement sur le GPU avec les geometry shaders.

Je vous tiendrai au courant de l'avancé!!

Offline Patapom

  • Base
    • View Profile
    • www.patapom.com
  • Ancienneté: 1988
  • Groupe: Bomb!
  • Rôle: Coder
  • Ville: Lyon
Re : System de particules et Mesh
« Reply #6 on: 27 January 2012 à 15:29:34 »
Franchement si tu veux faire tes tests avec une bonne base qui supporte les Geometry Shaders et toutes les nouvelles features DX10 et 11, je te conseille d'utiliser SharpDX créé par @lx !

C'est pas un framework à proprement parler, "seulement" un wrapper de DirectX (9, 10 et 11) en C# mais bon tu conserves tout le confort de développement en C# qu'XNA peut t'offrir, et c'est 100x plus agréable (et rapide !!!) que de développer en C++ vu que tu as le framework .Net pour t'aider.
Ca fait maintenant presque 1 an que je l'utilise (mon renderer Nuaj' est basé dessus) et je ne peux en dire que du bien ! C'est mieux que SlimDX car 1) les assemblies sont séparées, pas besoin de TOUT inclure et 2) tu as la doc des fonctions DirectX embedded et 3) c'est @lx qui l'a fait. :D
.  Pom  .

Offline dj_himp

  • Base
    • View Profile
  • Rôle: code
  • Ville: Montreuil
Re : System de particules et Mesh
« Reply #7 on: 27 January 2012 à 15:36:01 »
Ok merci pour ce conseil que je vais suivre !! Ca me permettra d'aller plus vite à la partie interressante ;D et en plus fait par un français!! (cocorico  8) )

Offline Patapom

  • Base
    • View Profile
    • www.patapom.com
  • Ancienneté: 1988
  • Groupe: Bomb!
  • Rôle: Coder
  • Ville: Lyon
Re : System de particules et Mesh
« Reply #8 on: 27 January 2012 à 16:10:42 »
Ouais, sauf qu'il s'est lâchement expatrié au Japon pour être le premier à bénéficier des radiations l'ordure ! Y en a qui feraient vraiment n'importe quoi pour une tentacule sur le front !
.  Pom  .

Offline dj_himp

  • Base
    • View Profile
  • Rôle: code
  • Ville: Montreuil
Re : System de particules et Mesh
« Reply #9 on: 27 January 2012 à 16:14:02 »
Haha c'est peut être aussi pour avoir un jolie glow verdatre autour de lui pour devenir le premier d'une nouvelle espèce : le humanDemoïde  ;D

Offline RaHoW

  • Base
    • Pouet.net
    • View Profile
    • Apex - official site
  • Ancienneté: 1993
  • Groupe: Apex
  • Rôle: Gfx, code, orga
Re : System de particules et Mesh
« Reply #10 on: 27 January 2012 à 17:10:40 »
(bon sang, c'est la confirmation de ce que je disais sur un autre post... ^^;;; )
=RaHoW/Apex=

Offline Patapom

  • Base
    • View Profile
    • www.patapom.com
  • Ancienneté: 1988
  • Groupe: Bomb!
  • Rôle: Coder
  • Ville: Lyon
Re : System de particules et Mesh
« Reply #11 on: 27 January 2012 à 17:41:55 »
Quoi donc ? Qu'@lx avait muté ?
.  Pom  .

Offline RaHoW

  • Base
    • Pouet.net
    • View Profile
    • Apex - official site
  • Ancienneté: 1993
  • Groupe: Apex
  • Rôle: Gfx, code, orga
Re : System de particules et Mesh
« Reply #12 on: 28 January 2012 à 16:51:49 »
Nop, que si tout le monde faisaient ses demos comme dans la Aganda Cycling Forth, la scene finiraient par devenir chiante ^^;;;
=RaHoW/Apex=

ponce

  • Guest
Re : System de particules et Mesh
« Reply #13 on: 29 January 2012 à 18:45:00 »