Demoscene.fr BBS

Articles et discussions techniques => Code => Topic started by: Elrick on 30 April 2012 à 19:43:04

Title: 1M particules
Post by: Elrick on 30 April 2012 à 19:43:04
http://youtu.be/YwS1WAtm6-w (http://youtu.be/YwS1WAtm6-w)

d'après d'autres vidéos de lui, il utilise une texture 1024x1024 pour contenir la position de ces particules<- ya de la doc quelque part sur la technique utilisée ?
Title: Re : 1M particules
Post by: LittleWhite on 30 April 2012 à 19:48:40
Bonjour,

Dans le ReadME de Shoal (http://"http://pouet.net/prod.php?which=59076") ils disent avoir 4 Million de particules (OpenGL + OpenCL)
Title: Re : 1M particules
Post by: LLB on 30 April 2012 à 19:56:50
Sinon, Smash fait ça (en mieux) depuis un moment : blunderbuss, agenda circling forth, ceasefire (all falls down..), numb res...
Il explique les techniques sur son blog : http://directtovideo.wordpress.com (http://directtovideo.wordpress.com)
Title: Re : 1M particules
Post by: Patapom on 30 April 2012 à 20:10:17
Y a plus rien d'étonnant sur les cartes modernes d'afficher 1 million de particules...

Tu alloues 2 render targets de 1024x1024 puis tu appliques un shader simple pour faire évoluer tes particules, ensuite tu appliques un vertex shader qui affiche 1 million de points qui vont sampler leur position dans la render target précédement calculée, puis tu appliques un pixel shader qui affiche une couleur moisie et voilà !
Title: Re : 1M particules
Post by: Elrick on 30 April 2012 à 20:15:37
@llb&littlewhite c'est pas tant le nombre que le "comment qu'on fait"

@patapom, ok donc la on oublie la manipulation des particules une a une pour la durée de vie et tt et tt, tu initialises juste les textures et ensuite tout se fait ds le VS ?
j'imagine que toute la difficulté réside donc dans la manière rendre l'ensemble parametrable non ?
Title: Re : 1M particules
Post by: Patapom on 30 April 2012 à 20:41:43
Non tout se fait dans le PIXEL shader. En fait tu as 2 pipelines si tu veux :

1) Le premier est un quad avec un pixel shader qui travaille uniquement sur la render target contenant les positions et qui fait :
  . Lit le pixel contenant la position courante de la particule depuis la Render Target 0
  . Applique une formule à la con pour modifier cette position (là dans la vidéo on dirait une simulation de ressort un peu foireuse)
  . Stocke la nouvelle position dans la Render Target 1
Puis tu swappes RT0 / RT1 chaque frame

2) Le second pipeline c'est un VS, un GS et un PS, tous très simples :
  . Le VS prend 1 million de points en entrée (en réalité, un seul point instancié 1 million de fois). Tu samples la position du point depuis la render target courante calculée par le pipeline précédent.
  . Le GS étend chaque point en un tout p'tit quad (ou un triangle si vraiment tu comptes afficher des points)
  . Le PS se contente d'afficher une couleur. Une couleur unie ou une couleur calculée dans le VS que tu passes au PS...


NOTE: Quand je parle de PS, je parle pas du parti politique de connards mais bien de pixel shaders...  8)
Title: Re : Re : 1M particules
Post by: Elrick on 30 April 2012 à 20:47:02

NOTE: Quand je parle de PS, je parle pas du parti politique de connards mais bien de pixel shaders...  8)
j'avais bien compris  :)

tain j'ai la mort je comprend le principe ... mais j'ai la fleme de le coder :'(
Title: Re : 1M particules
Post by: wullon on 30 April 2012 à 21:39:21
Avoir aussi le making of de FFF, vidéo + liés ici : http://bbs.demoscene.fr/actu/making-of-de-fff-(invitation-demojs)-mercredi-30-a-paris/ (http://bbs.demoscene.fr/actu/making-of-de-fff-(invitation-demojs)-mercredi-30-a-paris/)
Title: Re : Re : 1M particules
Post by: Elrick on 30 April 2012 à 23:35:28
Avoir aussi le making of de FFF, vidéo + liés ici : http://bbs.demoscene.fr/actu/making-of-de-fff-(invitation-demojs)-mercredi-30-a-paris/ (http://bbs.demoscene.fr/actu/making-of-de-fff-(invitation-demojs)-mercredi-30-a-paris/)

j'avais pas vu, tres interessant
Title: Re : 1M particules
Post by: Zavie on 03 May 2012 à 11:49:14
Non tout se fait dans le PIXEL shader. En fait tu as 2 pipelines si tu veux :

1) Le premier est un quad avec un pixel shader qui travaille uniquement sur la render target contenant les positions et qui fait :
  . Lit le pixel contenant la position courante de la particule depuis la Render Target 0
  . Applique une formule à la con pour modifier cette position (là dans la vidéo on dirait une simulation de ressort un peu foireuse)
  . Stocke la nouvelle position dans la Render Target 1
Puis tu swappes RT0 / RT1 chaque frame

Ça me rassure, c'est à peu près l'idée que je m'étais faite du machin. Avec éventuellement une partie supplémentaire : la (ou les pour un ping pong) RT représentant le vector field (en 3D, par slices) dans le cas où c'est implémenté de cette manière, typiquement pour des fluides.

Quote
2) Le second pipeline c'est un VS, un GS et un PS, tous très simples :
  . Le VS prend 1 million de points en entrée (en réalité, un seul point instancié 1 million de fois). Tu samples la position du point depuis la render target courante calculée par le pipeline précédent.
  . Le GS étend chaque point en un tout p'tit quad (ou un triangle si vraiment tu comptes afficher des points)
  . Le PS se contente d'afficher une couleur. Une couleur unie ou une couleur calculée dans le VS que tu passes au PS...

Il y a un intérêt a passer par un GS plutôt qu'un point sprite ?

Concernant le polygone, j'ai vu a plusieurs reprises déjà la recommandation d'utiliser un triangle avec des coordonnées de textures qui vont bien (je suppose avec un alpha test pour rejeter rapidement les fragments), pour éviter de gaspiller un deuxième triangle pour chaque particule.

Enfin la question que je me pose encore : comment on évite d'avoir un million de drawcalls ? Voire, est-ce que je peux ne faire qu'un seul drawcall, et le nombre de particules dépend des données sur le GPU ?


Quote
NOTE: Quand je parle de PS, je parle pas du parti politique de connards mais bien de pixel shaders...  8)

FS ? :)


P.S. : le sujet des particules et des fluides a pas mal été traité au SIGGRAPH l'année dernière (un mot clé qui est beaucoup revenu c'était "voxelization". :)
Title: Re : Re : 1M particules
Post by: Elrick on 03 May 2012 à 13:00:49

Enfin la question que je me pose encore : comment on évite d'avoir un million de drawcalls ? Voire, est-ce que je peux ne faire qu'un seul drawcall, et le nombre de particules dépend des données sur le GPU ?


bah si j'ai bien compris vu que tu traites toutes tes particules d'un coup (dans la texture), tu as 2 draw call: 1 pour MAJ les particules et 1 pour afficher, non ?
Title: Re : 1M particules
Post by: Patapom on 03 May 2012 à 13:43:32
Oui, y a qu'un seul draw call, c'est en fait un DrawInstanced( 1000000 );  ;D
Ensuite, dans le vertex shader (en tout cas en DX) c'est très facile d'utiliser SV_INSTANCEID pour connaître l'index du point traité et recalculer les UV dans ta render taret de positions depuis cet index.

Quote
Il y a un intérêt a passer par un GS plutôt qu'un point sprite ?
Bah c'est surtout qu'en DX on n'a plus le choix vu que les point sprites n'existent plus...
Title: Re : 1M particules
Post by: octobinz on 21 May 2012 à 19:15:50
Quote
(je suppose avec un alpha test pour rejeter rapidement les fragments)
Moué, si je ne m'abuse, si ton fragment n'est pas discard par le Hiz/stencil, l'alpha test va pas améliorer tes perfs.
Title: Re : 1M particules
Post by: RaHoW on 23 May 2012 à 22:17:58
Hey Octo ^^
Title: Re : 1M particules
Post by: maracuja on 24 May 2012 à 17:08:10
\o/