Forums Développement Multimédia

Aller au contenu

Gestion de voxels transparents

CODE Actionscript

9 réponses à ce sujet

#1 durss

  • Members
  • PipPipPipPipPipPipPipPip
  • 1965 messages

Posté 28 July 2012 - 12:49 PM

Ou l'éternel problème de la transparence...

Pour vous mettre dans le contexte j'ai fait ce petit éditeur en rapport à un jeu de Motion-Twin :
http://fevermap.org/kub3dit
(le jeu en question : http://kube.muxxu.com)

Ca marche pas trop mal, à l'exception du rendu des quelques cubes comportant de la transparence, par exemple sur cette carte.

Le moteur trie les chunks selon la position de la caméra, mais les vertices des chunks eux ne sont évidemment pas z-sortés constemment.
Du coup, la gestion de la transparence au sein d'un même chunk n'est pas bonne puisque potentiellement un pixel transparent sera écrit avant un pixel opaque bloquant son écriture par le Shader.

Si j'ai bien compris, dans ce genre de cas, l'idée est de procéder en deux rendus avec une première passe pour afficher les éléments opaques, et une seconde pour les transparents.

Le souci c'est que, à moins de ne gérer TOUS les cubes transparents comme un seul mesh j'aurais toujours le même problème de transparence au sein du calque transparent entre les divers chunks non?


Nicolas Canasse m'avait expliqué sa méthode pour gérer ce problème dans son jeu, et même si j'en comprends plus ou moins le principe, je n'arrive pas du tout à la mettre en place :cry: ...
Voici la formule magique telle qu'expliquée :

Citation

Pour la transparence il faut soit trier les triangles et faire une rendu back-to-front, soit (ce que je fais dans Kube) un premier pass qui affiche les blocks non transparents, puis un second pass qui écris juste dans le ZBuffer et un troiseme pass qui ajoute juste la transparence quand le Z est strictement égal.

Je coince un peu sur l'écriture dans le z-buffer et l'ajout de la transparence seulement si le Z est strictement égal.
J'ai tenté de jouer avec le setStencilActions en combo avec setDepthTest sans grand succès.
J'imagine que ça se passe donc plus au niveau du FragmentShader mais j'ai bien du mal à voir comment mettre ça en place.

Un chef de la 3D saurait expliquer ça au noob que je suis.? :oops:

#2 Jean-Marc Le Roux

    Ceinture Noire

  • Minko
  • PipPipPipPipPipPipPip
  • 210 messages

Posté 30 July 2012 - 08:35 AM

Je crois qu'il y'a déjà pas mal d'explications ici :

http://forums.mediab...e-transparente/

#3 Durss

    Ceinture Orange

  • Members
  • PipPipPip
  • 43 messages

Posté 30 July 2012 - 09:51 AM

Salut et merci pour ta réponse :)

J'avais effectivement bouquiné les divers sujets de ce forum ainsi que pas mal d'autres ressources (ça fait quasi 1 an que j'avais commencé à regarder ce souci ^^'. A peu près quand j'ai commencé ce projet finalement).
Je vais essayer de relire plus en détail ton lien dans la soirée; il a l'air de s'être sacrément creusé le choux le bonhomme!

Au cas où je précise un petit "détail" qui est que, idéalement, je ne veux pas qu'on voit un cube transparent derrière un autre.
Je veux le résultat de droite et non celui de gauche dans ce sublimissime ( :mrgreen:) schéma
Image attachée: transp1.png

Merci encore d'avoir pris un peu de ton temps pour me lire :)


aaah la 3D quand on a aucun background c'est rigolo mais pas mal calviçiant !

#4 Jean-Marc Le Roux

    Ceinture Noire

  • Minko
  • PipPipPipPipPipPipPip
  • 210 messages

Posté 30 July 2012 - 14:23 PM

Tu veux de la transparence sans qu'on voit ce qu'il y'a derrière ?

#5 Durss

    Ceinture Orange

  • Members
  • PipPipPip
  • 43 messages

Posté 30 July 2012 - 16:11 PM

Ahah si si pardon.
Bonne question que tu pose là et qui met en exergue un petit oubli dans mon énoncé dû au fait que je n'avais pas pensé que les deux cas sous-cités ne pourraient pas forcément être gérés de la même manière.

En fait il y a deux sortes de transparence, les cubes feuillus/herbes qui ont des textures trouées, et d'autres, qui ne sont pas gérés par mon éditeur éditeur, qui sont des aplats de transparence et qui ont un rendu un peu différent.

Ces cubes unis devraient avoir un rendu de ce type in-app :
Image attachée: transp2.png
(par défaut ça donnerait ce qu'il y a à gauche, mais je voudrais plutôt ce qu'il y a à droite)

Mais tout bien réfléchit, le simple fait que pour les feuillus ont puisse voir les autres cubes feuillus au travers ce qui n'est pas le cas des transparents unis fait qu'avoir un même traîtement graphique pour les deux va être compliqué.

Je ne sais pas si l'explication de Nicolas Canasse était spécifique à ces cubes unis ou non à dire vrai. Mais j'imagine que si du coup.

Désolé pour le manque de clarté dans mes explications mais comme tu l'auras constaté, tout ça n'est pas très clair pour moi.

#6 lilive

  • Guests

Posté 31 July 2012 - 18:23 PM

Bonjour,

Je n'ai pas beaucoup d'expérience en 3D, mais je peux toujours dire ce que j'essaierais ;)

La proposition de Nicolas me semble appropriée pour ce que tu veux faire.
Voici comment je la comprends:

1ere passe:
Avec les triangles des blocs non transparents.
En utilisant
setDepthTest(true, Context3DCompareMode.LESS)
pour que les profondeurs des pixels dessinés aillent dans le z-buffer.
(il faut dans ce cas que l'axe des z soit orienté de l'observateur vers le lointain, je ne me souviens plus si c'est comme ça qu'on fait habituellement ou si c'est l'inverse. Si c'est l'inverse mettre GREATER à la place de LESS)

2e passe:
Avec les triangles des blocs transparents.
Il faut toucher uniquement au z-buffer et ne pas dessiner les pixels. Il y a mieux j'espère, mais à défaut je vois comme solution d'utiliser:
setDepthTest(true, Context3DCompareMode.LESS)
setBlendFactors(Context3DBlendFactor.ZERO, Context3DBlendFactor.ONE)
Le résultat devrait être que les pixels seront peints avec la couleur qu'ils ont déjà suite à la passe 1, mais la valeur du z-buffer mise à jour pour les pixels transparents qui sont devant les pixels des blocs opaques.
Vu que la couleur renvoyée par le fragment shader n'a aucune importance, le simplifier au maximum.

3e passe:
Toujours avec les triangles des blocs transparents.
setDepthTest(true, Context3DCompareMode.EQUAL)
setBlendFactors(Context3DBlendFactor.ONE, Context3DBlendFactor.ONE_MINUS_SOURCE_ALPHA)
Comme cela les seuls pixels transparents qui vont être dessinés sont ceux qui sont le plus devant. C'est-à-dire que si 2 pixels transparents se superposent, seul le plus en avant va être dessiné car la passe 2 à noté sa profondeur dans le z-buffer.

#7 Durss

    Ceinture Orange

  • Members
  • PipPipPip
  • 43 messages

Posté 01 August 2012 - 14:43 PM

Wouahou ça a l'air parfait sur le principe ce que tu me propose !! C'est ce que j'avais déjà testé mais sans la seconde étape.

J'ai pas encore eu le temps de lire en détail tous tes déboires sur le sujet que m'a donné Jean-Marc mais ça semble assez instructif donc j'irais voir ça plus en détail.

J'espère pouvoir tester la solution que tu viens de me donner dans la soirée :)!

Merci beaucoup d'avoir pris le temps de me répondre, j'apprécie vraiment!

#8 Jean-Marc Le Roux

    Ceinture Noire

  • Minko
  • PipPipPipPipPipPipPip
  • 210 messages

Posté 02 August 2012 - 14:52 PM

La passe 2 est inutile si tu peux trier tes voxels avec l'algo du peintre. Il est parfois plus simple d'éviter de faire 2 passes.

#9 durss

  • Members
  • PipPipPipPipPipPipPipPip
  • 1965 messages

Posté 01 November 2012 - 20:12 PM

Mille excuses pour le temps de réponse mais je n'ai pas eu beaucoup de temps et/ou de courage pour m'y plonger depuis..
Si je passe, c'est parce que je m'y suis remis et que la solution de Lilive fonctionne à merveille !!

C'est vraiment génial merci infiniment !!

Et merci également à Jean-Marc pour le temps passé ;).
Trier les trucs tout bien tout en gardant quelque chose d'optimisé je crains que ça ne me dépasse un peu pour l'instant.

#10 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 03 November 2012 - 16:01 PM

Voir le messagedurss, le 01 November 2012 - 20:12 PM, dit :

Mille excuses pour le temps de réponse mais je n'ai pas eu beaucoup de temps et/ou de courage pour m'y plonger depuis..
Pas de quoi, je vois bien de quoi tu parles!

Content que ça marche.

++ :)



1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)