Commander une transparence indépendante dans le système de particules

9

J'écris un système de particules et je voudrais trouver une astuce pour réaliser un mélange alpha correct sans trier les particules car:

  • Chaque particule est un sprite ponctuel dans un seul maillage et je ne peux pas utiliser la capacité de graphe de scène pour trier les nœuds transparents. Cependant, le nœud système doit être correctement trié.
  • La position des particules est calculée sur le shader à partir de la vitesse initiale, de l'accélération et du temps. Afin de trier le système, je devrais effectuer tous ces calculs sur le processeur, ce que je veux éviter.
  • Trier des centaines de particules par rapport à la position de la caméra et les télécharger sur les coutures GPU de chaque image pour un fonctionnement silencieux et intensif.

Le test alpha semble être assez rapide sur GLES 2.0 et fonctionne très bien pour les textures non transparentes mais "masquées". Pourtant, cela ne suffit pas pour les particules semi-transparentes.

Comment voulez-vous gérer cela?

Stepan Zastupov
la source
A quel point est-il essentiel qu'ils soient correctement triés? Avez-vous réellement vu des artefacts (importants) utilisant le mélange de vanille?
ChrisE
Une particule peut se fondre avec le fond au lieu d'une autre particule, puis l'essence "rectangle" du sprite ponctuel est très perceptible. Les tests alpha sont utiles ici, mais les artefacts sont toujours visibles lorsque la valeur alpha est faible mais pas suffisante pour éliminer le fragment.
Stepan Zastupov
6
Avez-vous essayé d'écrire en profondeur désactivée (en laissant les tests de profondeur activés) lors du rendu des particules? Cela devrait rendre la commande incorrecte moins évidente.
Adam
2
Après quelques expériences, j'ai découvert que la désactivation de l'écriture en profondeur est la meilleure solution dans la plupart des cas.
Stepan Zastupov

Réponses:

10

Voici ce que je ferais.

Étape 1: ne triez pas. Simplement fais-le. Voyez si c'est un problème. Probablement pas.

Étape 2: Limitez les particules dans celles qui n'ont pas vraiment besoin d'être triées, telles que:

  • Juste des solides (avec éventuellement des bords alpha à couvrant)

    • laissez zbuffer s'occuper du tri.
  • Juste des bits additifs

    • a + b = b + a, donc l'ordre n'a pas d'importance

Étape 3: si plus est nécessaire, divisez le rendu des particules en bits qui doivent être devant et le reste, et effectuez le rendu en plusieurs passes (pourrait corriger la fumée complexe, par exemple)

Étape 4: si plus est encore nécessaire, ou si vous avez besoin d'une solution générale, une chose qui vous vient à l'esprit serait d'utiliser les TRM pour effectuer un tri très approximatif du seau N; rendre les particules dans N surfaces de sortie et les composer dans une passe séparée.

Tout autre élément nécessiterait plus d'informations sur votre cas d'utilisation spécifique. Mais je suis quasiment sûr que vous n'avez pas vraiment besoin de l'indépendance des commandes après tout. Utilisez juste assez de particules au hasard et ça ira =)

Jari Komppa
la source
6

N'écrivez simplement pas dans le tampon de profondeur lors du rendu des particules. Cela leur permettra d'être tous rendus et mélangés les uns avec les autres. Cependant, vous devez toujours effectuer des tests de profondeur afin qu'ils puissent être correctement occlus par la géométrie dans la scène.

KlashnikovKid
la source
5

L'utilisation de l'ordre de mélange additif n'a pas d'importance:

glEnable(GL_BLEND)
glDepthMask(GL_FALSE)
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)
DrawParticles();

// Now turn depth masking on and blending off, so state is unchanged.
glDepthMask(GL_TRUE)
glDisable(GL_BLEND)

Cela suppose que votre texture de sprite a un fond transparent.

teh_leecherer
la source