[DirectX] Un problème d'un système de particules

Le côté programmation du développement d'un jeu vidéo.

Un problème d'un système de particules

Messagepar WormsParty » 11 Aoû 2006, 18:37

Bonjour :-)

Je tente de mettre sur pied un petit jeu en c++ avec DirectX. J'ai voulu créer un système de particules avec pour image un nuage ( format TGA, donc avec le canal alpha intégré qui cache les bords du nuage ). Mes particules partent en rond en un point que je peux définir, pas de problème à ce niveau là. Le problème est lors du dessin : Soit je dèsactive le D3DRS_ZWRITEENABLE ( comme il est mis dans la propart des exemples de point sprite ) et les nuages vont n'importe comment : l'un va sur l'autre même si il est plus loin que l'autre ce qui est visuellement très désagréable, soit je l'active : Là, les parties transparentes le sont effectivement, mais derrière il n'est rien dessiné !

Voir ici une image des deux situations :
http://mypage.bluewin.ch/WormsParty/kaunn.jpg

et ici le code lors du dessin :

Code: Tout sélectionner
pd3dDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_FALSE);
pd3dDevice->SetRenderState(D3DRS_POINTSPRITEENABLE,true);
pd3dDevice->SetRenderState(D3DRS_POINTSCALEENABLE,true);
pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,true);
pd3dDevice->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA);
pd3dDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
pd3dDevice->SetTextureStageState(0,D3DTSS_ALPHAARG1,D3DTA_TEXTURE);
pd3dDevice->SetRenderState(D3DRS_POINTSIZE, FtoDW( 1.0f ));
pd3dDevice->SetRenderState(D3DRS_POINTSCALE_A, FtoDW( 1.0f) );
pd3dDevice->SetRenderState(D3DRS_POINTSCALE_B, FtoDW( 1.0f) );
pd3dDevice->SetRenderState(D3DRS_POINTSCALE_C, FtoDW( 0.0f ) );
pd3dDevice->SetTexture( 0, TextureNuage );
pd3dDevice->SetStreamSource( 0, Point_VB, 0, sizeof(POINTVERTEX) );
pd3dDevice->SetFVF( D3DFVF_POINTVERTEX );      
pd3dDevice->DrawPrimitive( D3DPT_POINTLIST, 0, System->n - System->destroyed );
pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,false);
pd3dDevice->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_ONE);
pd3dDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_ONE);
pd3dDevice->SetRenderState(D3DRS_POINTSPRITEENABLE,false);
pd3dDevice->SetRenderState(D3DRS_POINTSCALEENABLE,false);
pd3dDevice->SetRenderState(D3DRS_ZWRITEENABLE, true);


Que faire pour que ça se chevauche pas n'importe comment ? :00000003:
WormsParty
Hello World, I'm new !
 
Messages: 10
Inscription: 11 Déc 2005, 02:19

Messagepar grob1212 » 14 Aoû 2006, 09:45

Si j'ai bien compris, rien que le fait d'activer l'écriture dans le Z-Buffer à pour conséquence d'afficher les nuages n'importe comment ?

Il me semble avoir lu quelquepart que les pointsprites sont mal supportés par quelques cartes graphiques. As-tu testé sur une autre CG ?
grob1212
Hello World, I'm new !
 
Messages: 277
Inscription: 13 Avr 2005, 15:12

Messagepar WormsParty » 14 Aoû 2006, 12:50

Non mais le problème n'est pas là :

Si on active le Z-BUFFER, alors tout ce qui est dessiné derrière un pixel déja dessiné n'est pas redessiné. Le pixel est 100% transparent mais vu que le Z-BUFFER est activé, il détectera un pixel et ne dessinera pas derrière.

Si on le désactive, alors il dessine toujours ce qui est dessiner dans les particules. Donc vu qu'il dessine tout dans un certain ordre ( l'ordre de création ) alors les derniers créés se verront tout devant et les premiers derrière...

De faire tester la profondeur à laquelle est chaque particule par rapport aux autres et à la camera et définir l'ordre de dessin ainsi me parrait un peu gourmand en images par seconde... non ?
WormsParty
Hello World, I'm new !
 
Messages: 10
Inscription: 11 Déc 2005, 02:19

Messagepar grob1212 » 14 Aoû 2006, 14:20

regarde un peu ce lien
grob1212
Hello World, I'm new !
 
Messages: 277
Inscription: 13 Avr 2005, 15:12

Messagepar WormsParty » 14 Aoû 2006, 15:32

Bon ben je crois que je vais changer dynamiquement l'ordre de dessin... faudra pas que j'en créé trop des particules :00000005:
WormsParty
Hello World, I'm new !
 
Messages: 10
Inscription: 11 Déc 2005, 02:19

Messagepar WormsParty » 15 Aoû 2006, 13:27

Ca y est j'ai réussi :-)
J'ai changé dynamiquement l'ordre et ça marche ; il faut tester le distance point / camera et faire dessiner du plus loin au plus proche, tout en desactivant le Z-Buffer, évidemment.

Image :
http://mypage.bluewin.ch/WormsParty/reussi.JPG

Merci pour ton aide :)
WormsParty
Hello World, I'm new !
 
Messages: 10
Inscription: 11 Déc 2005, 02:19

Messagepar grob1212 » 15 Aoû 2006, 15:19

C'était un plaisir !

As-tu évalué l'impact du tri en terme de performances (framerate sans et avec le tri) ?
grob1212
Hello World, I'm new !
 
Messages: 277
Inscription: 13 Avr 2005, 15:12

Messagepar WormsParty » 16 Aoû 2006, 08:40

J'ai testé :
Sans le tri, en créant 100 particules en 1 point ( pour prendre un gros cas )
On passe de 252 images / seconde à 116

Avec le tri, en créant 100 particules en 1 point :
On passe de 252 images / seconde à 115

Rien d'important ^_^
WormsParty
Hello World, I'm new !
 
Messages: 10
Inscription: 11 Déc 2005, 02:19


Retourner vers Programmation

Qui est en ligne

Utilisateurs parcourant ce forum: Yahoo [Bot] et 24 invités

cron