Ordre des layers Particle Systems

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Nanospin
Messages : 12
Inscription : 31 Juil 2014 22:23

Ordre des layers Particle Systems

Message par Nanospin » 31 Juil 2014 22:37

Bonjour à tous,

je suis very noob sur Unity, en fait je fais de mon mieux pour apprendre à maîtriser le logiciel, simplement parce qu'une idée de jeu me trotte dans la tête depuis longtemp...
J'ai de bonnes notions de programmation mais je suis novice en 3D.
Pour le menu de mon jeu je voudrais modéliser une galaxie en rotation avec des systèmes de particules.
J'ai trouvé un script plutôt versatile sur internet:
http://wiki.unity3d.com/index.php?title ... ral_Effect

J'ai crée deux de spirales correspondant grosso modo à des nuages de gaz, l'autre à des étoiles.
Cela utilise le script associé à deux systèmes de particules avec des component Particle Renderer et Mesh Emitter.
Sans trop rentrer dans les détails (ce que je pourrais faire si nécessaire...) mon problème est le suivant:

Lors de la rotation l'ordre d'affichage des layers semblent s'inverser comme ces images illustrent:
galaxy_noire.png
galaxy_noire.png (82.22 Kio) Consulté 4352 fois
galaxy_blanche.png
galaxy_blanche.png (176.37 Kio) Consulté 4352 fois
Je ne sais vraiment pas quelle est la source de ce problème,
Je ne sais pas non plus quelles informations vous donner pour que vous puissiez m'aider

Milles excuses si je ne suis pas au bon endroit,
Et surtout merci beaucoup pour tout aide éventuelle :)

Nanospin
Messages : 12
Inscription : 31 Juil 2014 22:23

Re: Ordre des layers Particle Systems

Message par Nanospin » 31 Juil 2014 23:35

Bon j'suis désolé d'avoir posté un message pour ça... j'ai trouvé la solution si ça peut aider:

Il faut ordonner soit même le renderQueue de l'un des systèmes de particules en créant un script, une fonction start et contenant cette ligne:

Code : Tout sélectionner

renderer.material.renderQueue=2800;
OUF, j'avais peur d'avoir redéfini les lois de la physique ! on aurait trouver la première matière capable d’apparaître et disparaître par simple rotation dans l'espace ....

Avatar de l’utilisateur
Alesk
Messages : 2303
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

Re: Ordre des layers Particle Systems

Message par Alesk » 04 Août 2014 13:06

Salut,

Es-tu sûr que le souci est réglé dans tous les cas ? Si tu balade ta caméra autour de ton nuage de particules, l'ordre d'affichage est bien respecté ?

Normalement ce souci est causé par la façon dont sont affichées les triangles transparents : lors du traçage des pixels concernés par ces triangles, contrairement au triangles rendu avec un shader opaque, aucune écriture dans le ZBuffer n'est faite, du coup le moteur de rendu n'a aucune indication de profondeur pour afficher ou non un pixel.
Pour bien comprendre, il faut savoir comment fonctionne un moteur de rendu lorsqu'il traite les triangles des meshes et les convertit en pixels à l'écran :

Pour chaque triangle visible par la caméra, une boucle est faite pour l'afficher pixel par pixel. Pour chaque pixel à afficher, le moteur va tester le ZBuffer (indication de distance du pixel à la caméra) pour vérifier si ce pixel n'a pas déjà été rendu avec un pixel plus proche.
Si le ZBuffer contient une indication de distance plus courte que celle que l'on veut afficher, c'est que le point que l'on veut afficher se trouve derrière un autre déjà rendu, donc on ignore ce cas.
Au contraire, si le distance stockée dans le ZBuffer à la position de ce pixel est plus éloignée, c'est que le pixel à afficher est plus proche de la caméra, il est donc devant et écrase alors l'ancienne valeur stockée dans le ZBuffer et les autres couches (RGB)

Dans le cas d'un shader transparent, cette étape d'écriture dans le ZBuffer n'est pas utilisable, il faut donc utiliser d'autres méthode pour trier les triangles selon la distance à la caméra pour bien les afficher dans l'ordre.

Pour commencer, Unity va se référer à la bounding box de chaque gameobject pour déterminer lequel et devant l'autre. ça fonctionne bien si les objets sont distants, mais s'ils s'interpénètrent on tombe sur un conflit d'ordre d'affichage car il va faire le rendu de tous les triangles d'un objet puis tous les triangles de l'autre, mais sans tenir compte de l'interpénétration, et on se retrouve alors avec l'effet que tu as décris dans ton premier message : on a l'impression que chaque mesh est rendu dans un calque 2d séparé, l'un par dessus l'autre, au lieu d'être bien mixés selon la profondeur de chaque triangle.

Du coup, la solution à ce problème est d'avoir tous les triangles triés selon leur distance à la caméra pour qu'ils soient rendu du plus éloigné au plus proche (tu as cette option dans le renderer du particle system, Sort Mode -> Distance)...
Et si tu utilises un shader de rendu en "Additive" ou en "Multiply", ça n'a pas vraiment d'intérêt.

Mais ça ne vaut de toute manière que pour un seul particle system à la fois, du coup quand tu en as plusieurs qui se croisent, ça ne règle pas le souci...

Si en réglant le renderqueue, ça semble régler le souci (Unity pourrait dans ce cas fusionner en interne le rendu des deux meshes) fais-bien attention à ce que ça soit vraiment toujours le cas lorsque tu fais tourner ton objet ou la caméra autour de lui.

Tu aurais un screenshot de ce que ça donne actuellement ?

Nanospin
Messages : 12
Inscription : 31 Juil 2014 22:23

Re: Ordre des layers Particle Systems

Message par Nanospin » 05 Août 2014 16:36

Hello merci pour toutes ces explications claires !

Le renderQueue semble avoir résolue le problème mais entre "semble" et "a" il y a un pas que je ne franchirais pas. Visuellement en tout cas je vois moins de problèmes.
Je suis un peu pommé dans le systèmes de particules, je reste ultra débutant, alors je bidouille comme je peux.
Ci-joint une capture de mon résultat actuel:
galaxy_finale.png
galaxy_finale.png (236.21 Kio) Consulté 4287 fois

Si vous avez une méthode propre pour obtenir ce genre d'objets, je suis preneur :)

Sur le plan artistique, je suis plutôt satisfait, je ne vois pas le clipping précédement décris, en ajoutant plus d'étoiles on aura forcement un meilleur rendu, mais je voudrais rester léger... j'ai pas encore décidé si je garde l'effet "branche" des étoiles qui est purement artificiel dans la vraie vie (en fait sur les photos c'est du au montage des télescopes...)

Avatar de l’utilisateur
Alesk
Messages : 2303
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

Re: Ordre des layers Particle Systems

Message par Alesk » 05 Août 2014 17:01

C'est bien chouette :)

Pour savoir si le souci est résolu, il suffit de faire tourner la galaxie sur elle-même dans tous les sens, ou bien de faire en sorte qu'on puisse se balader avec la caméra autour.
Si à aucun moment tu ne vois de particules qui apparaissent ou disparaissent d'un coup, c'est que c'est bon.

Nanospin
Messages : 12
Inscription : 31 Juil 2014 22:23

Re: Ordre des layers Particle Systems

Message par Nanospin » 05 Août 2014 17:57

Merci merci,

Je ne suis pas encore satisfait, j'aimerais avoir un résultat plus réaliste, mais bon, ça suffira pour le moment.
En tournant autour, je ne vois pas de problèmes à priori :)

Avatar de l’utilisateur
Alesk
Messages : 2303
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

Re: Ordre des layers Particle Systems

Message par Alesk » 05 Août 2014 17:59

tu pourrais poster un webplayer afin que l'on puisse voir ce que ça donne en rotation stp ?

Nanospin
Messages : 12
Inscription : 31 Juil 2014 22:23

Re: Ordre des layers Particle Systems

Message par Nanospin » 05 Août 2014 18:11

je ne sais pas trop où/comment héberger mon fichier html ?

Avatar de l’utilisateur
Alesk
Messages : 2303
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

Re: Ordre des layers Particle Systems

Message par Alesk » 05 Août 2014 18:26

bah avec dropbox c'est possible

Nanospin
Messages : 12
Inscription : 31 Juil 2014 22:23

Re: Ordre des layers Particle Systems

Message par Nanospin » 05 Août 2014 19:37

Avec Dropbox, il y a un moyen pour partager le webplayer sans pour autant balancer le fichier .unity3d ?
C'est pas parce que j'ai des choses à cacher hein, mon projet à ce stade très basique :)
C'est juste pour savoir comment faire.

Répondre

Revenir vers « Scripting »