Quelles sont les méthodes pour rendre la transparence dans OpenGL


14

Le mélange alpha peut être activé pour rendre les surfaces transparentes, comme ceci:

glDisable(GL_DEPTH_TEST); //or glDepthMask(GL_FALSE)? depth tests break blending
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

Mais cela ne fonctionne que si les objets sont rendus dans l'ordre arrière vers l'avant. Sinon, les choses en arrière-plan apparaissent devant des objets plus proches, comme le sol dans l'image ci-dessous. Pour les particules et les éléments de l'interface graphique, le tri serait OK, mais pour les maillages triangulaires, il semble que ce serait trop d'efforts et lent, comme indiqué ici: https://www.opengl.org/wiki/Transparency_Sorting .

Quelles sont les méthodes courantes pour y faire face? Je sais que c'est assez large et je ne suis pas après des détails de mise en œuvre approfondis, juste une brève description de certaines approches et de ce qui pourrait être impliqué.

entrez la description de l'image ici


Je ne sais pas si cela devrait être une réponse ou non, mais les erreurs dans votre image sont causées par un rendu sans test de profondeur sur toutes les primitives. Vous devez rendre la scène en 2 passes: commencez par rendre normalement toute la géométrie solide. Ensuite, désactivez les écritures de profondeur (pas GL_DEPTH_TEST) et restituez la géométrie translucide dans un ordre approximatif. Cela garantira que la géométrie transparente ne sera pas dessinée devant la géométrie solide qui se trouve devant elle.
yuriks

@yuriks Dans ce cas, c'est probablement un mauvais exemple de ma part, mais tout est censé être transparent. Je voulais quelque chose pour montrer à quel point la transparence peut être mauvaise lorsqu'elle est mal faite. Également un exemple où le tri de la géométrie serait incroyablement difficile (par exemple ici, le sol est un polygone géant et couvre toute la plage de profondeur).
jozxyqk

Réponses:


10

Un ensemble de techniques pour éviter les commandes explicites s'appelle Order Independent Transparency (OIT pour faire court).

Il existe de nombreuses techniques OIT.

Historiquement, l'un est le peeling en profondeur . Dans cette approche, vous effectuez d'abord le rendu des fragments / pixels les plus en avant, puis vous trouvez le plus proche de celui trouvé à l'étape précédente et ainsi de suite, en continuant avec autant de "calques" que nécessaire. Cela s'appelle le peeling en profondeur car à chaque passage, vous "peler" une couche de profondeur. Toute votre couche peut ensuite être normalement recombinée d'arrière en avant. Pour implémenter cet algorithme, vous devez avoir une copie du tampon de profondeur.

Un autre ensemble de techniques sont les mélanges OIT. L'un des plus récents et des plus intéressants est l' OIT mélangé pondéré proposé par McGuire et Bavoil . Il applique essentiellement une somme pondérée pour toutes les surfaces qui occupent un fragment donné. Le schéma de pondération qu'ils proposent est basé sur l'espace de la caméra Z (comme approximation de l'occlusion) et l'opacité.
L'idée est que si vous pouvez réduire le problème à une somme pondérée, vous ne vous souciez pas vraiment de la commande.

Outre le document d'origine, une excellente ressource pour les détails de mise en œuvre et les problèmes de Weighted Blended OIT se trouve dans le blog de Matt Pettineo . Comme vous pouvez le lire dans son article, cette technique n'est pas une solution miracle. Le principal problème est que le système de pondération est central et doit être réglé en fonction de votre scène / contenu. D'après ses expériences, bien que la technique semble fonctionner correctement pour une opacité relativement faible et moyenne, elle échoue lorsque l'opacité approche 1 et ne peut donc pas être utilisée à partir de matériaux où une grande partie de la surface est opaque (il fait l'exemple du feuillage).

Encore une fois, tout se résume à la façon dont vous ajustez vos poids de profondeur et trouver ceux qui correspondent parfaitement à vos cas d'utilisation n'est pas nécessairement trivial.

Quant à ce qui est nécessaire pour l'OIT mixte pondéré, rien de plus que deux cibles de rendu supplémentaires. Celui que vous remplissez avec la couleur alpha prémultipliée (couleur * alpha) et alpha, tous deux pondérés en conséquence. L'autre pour les poids seulement.


6

Une option consiste à utiliser un pelage en profondeur.

Essentiellement, on traite la scène un nombre défini de fois (disons, nfois) afin de déterminer le plus proche, le deuxième le plus proche, jusqu'aux nfragments les plus proches de la scène.

Ce traitement est effectué en appliquant d'abord un test de profondeur régulier à toute la scène (qui renvoie naturellement la surface la plus proche). On utilise ensuite le résultat du test de profondeur pour filtrer la première couche, en ignorant tout avec une profondeur inférieure à celle retournée dans le test de profondeur.

Appliquer à nouveau le test de profondeur renverra alors la deuxième couche. Répétez au besoin.

Une fois que vous avez les calques, vous pouvez simplement dessiner tous les calques dans l'ordre inverse (en supposant que vous ayez suivi les couleurs RGBA pour chaque calque), en les mélangeant normalement, car les calques sont dans l'ordre avant-arrière.


1
Merci! Il semble que j'aurai besoin de deux tampons de profondeur pour cela. C'est-à-dire un pour stocker et filtrer les dernières profondeurs, et un pour effectuer le test de profondeur pour le rendu actuel. Corrigez-moi si je me trompe mais je suppose que j'ai besoin de deux textures de profondeur pour le FBO que j'échange entre chaque passe de peeling.
jozxyqk

1
@jozxyqk Correct, deux tampons de profondeur sont nécessaires pour cette procédure.
es1024

1

La crème de la crème du passage unique sans (ou peu) compromet la transparence dans OpenGL est un tampon A. Avec OpenGL moderne, il est possible d'implémenter:

http://blog.icare3d.org/2010/06/fast-and-accurate-single-pass-buffer.html

Il évite les multiples passes de pelage en profondeur et ne nécessite pas de tri onéreux.


3
Idéalement, les réponses devraient être autonomes et dépendre essentiellement de liens externes. Avoir des liens est bien pour du matériel supplémentaire, mais une réponse ne devrait pas se limiter à un mot clé. Si vous pouviez inclure quelques détails sur ce qu'est un tampon A et comment il fonctionne, cela améliorerait considérablement votre réponse.
Martin Ender
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.