Comment implémenter correctement le mélange alpha dans une scène 3D complexe?

11

Je sais que cette question peut sembler un peu facile à répondre, mais cela me rend fou. Il y a trop de situations possibles qu'un bon mécanisme de mélange alpha devrait gérer, et pour chaque algorithme auquel je pense, il manque quelque chose.

Voici les méthodes auxquelles j'ai pensé jusqu'à présent:

  • Tout d'abord, je pensais au tri des objets par profondeur, celui-ci échoue simplement parce que les objets ne sont pas des formes simples, ils peuvent avoir des courbes et peuvent boucler les uns dans les autres. Je ne peux donc pas toujours dire lequel est le plus proche de la caméra.

  • Ensuite, j'ai pensé à trier les triangles, mais celui-ci pourrait également échouer, je ne sais pas comment le mettre en œuvre.Il existe un cas rare qui pourrait à nouveau causer un problème, dans lequel deux triangles se traversent. Encore une fois, personne ne peut dire lequel est le plus proche.

  • La prochaine chose était d'utiliser le tampon de profondeur, au moins la principale raison pour laquelle nous avons un tampon de profondeur est à cause des problèmes de tri que j'ai mentionnés, mais maintenant nous obtenons un autre problème. Étant donné que les objets peuvent être transparents, dans un seul pixel, plusieurs objets peuvent être visibles. Alors, pour quel objet dois-je stocker la profondeur de pixels?

  • J'ai alors pensé que je ne pouvais peut-être stocker que la profondeur d'objet la plus frontale, et en utilisant cela, déterminer comment mélanger les prochains appels de dessin à ce pixel. Mais encore une fois, il y avait un problème, pensez à deux plans semi-transparents avec un plan solide au milieu d'eux. J'allais rendre le plan solide à la fin, on peut voir le plan le plus éloigné. Notez que j'allais fusionner tous les deux plans jusqu'à ce qu'il ne reste qu'une seule couleur pour ce pixel. Évidemment, je peux également utiliser des méthodes de tri pour les mêmes raisons que celles expliquées ci-dessus.

  • Enfin, la seule chose que j'imagine pouvoir travailler est de rendre tous les objets dans différentes cibles de rendu, puis de trier ces calques et d'afficher la sortie finale. Mais cette fois, je ne sais pas comment mettre en œuvre cet algorithme.

Ali1S232
la source

Réponses:

11

Réponse courte

Regardez dans le décollement en profondeur . D'après mes recherches, il semble être la meilleure alternative, bien que coûteux en calcul car il nécessite plusieurs passes de rendu. Voici une autre implémentation plus récente et plus rapide , également par NVIDIA.

Longue réponse

C’est une question difficile . La plupart des livres que j'ai lus survolent le sujet et le laissent à:

Commencez par effectuer le rendu de tous les objets opaques, puis mélangez les objets transparents au-dessus d'eux dans un ordre inverse.

Plus facile à dire qu'à faire, car l'approche évidente du tri des objets par leurs centroïdes ne garantit pas le bon ordre de tri.

C'est exactement le même problème, pourquoi l' algorithme du peintre ne fonctionne pas pour le cas général et un tampon de profondeur est nécessaire.

Cela dit, l'un des livres que j'ai mentionne quelques solutions:

  • Profondeur Peeling - une solution multi-passes qui surmonte la limitation du tampon de profondeur en nous donnant les nième fragments les plus proches, pas seulement le plus proche. Le plus grand avantage est que vous pouvez rendre les objets transparents dans n'importe quel ordre, et il n'est pas nécessaire de les trier. Cela peut être coûteux en raison des multiples passes, mais le lien que j'ai donné en haut semble améliorer les performances.

  • Stencil Routed K-Buffer - Utilisez le routage du pochoir pour capturer plusieurs couches de fragments par pixel par passe géométrique. Le principal inconvénient est que les fragments doivent être triés lors d'une passe de post-traitement.

Il mentionne également une solution matérielle au problème, mais je ne pense pas qu'elle soit réellement disponible:

  • F-Buffer - Un tampon FIFO de commande de rastérisation pour le rendu en plusieurs passes. Néanmoins, une bonne lecture et l'introduction parlent également un peu du problème de l'ordre de tri de la transparence et des solutions actuelles.

Autres solutions de contournement qui ne fournissent pas de résultats parfaits mais qui valent mieux que rien:

  • Après avoir rendu tous les objets opaques, continuez à utiliser le test Z-buffer pour les objets transparents mais désactivez l'écriture Z-buffer . Vous pouvez obtenir certains artefacts d'un tri incorrect, mais au moins tous les objets transparents seront visibles.

Et en citant le livre blanc sur le tampon F ci-dessus:

La solution la plus simple consiste à rendre chaque polygone partiellement transparent de manière totalement indépendante (c'est-à-dire à rendre toutes ses passes avant de passer au polygone suivant). Cette solution est généralement d'un coût prohibitif en raison du coût de changement d'état qui est encouru. Alternativement, l'application ou la bibliothèque d'ombrages peut regrouper des polygones pour garantir que seuls les polygones non superposés sont rendus ensemble. Dans la plupart des cas, cette solution n'est pas non plus intéressante, car elle nécessite que le logiciel effectue une analyse de l'espace écran des polygones.

David Gouveia
la source
11

La bonne réponse est n ° 1: trier toutes vos choses par profondeur et les rendre (évidemment, désactivez l'écriture en profondeur, mais pas les tests). Qu'est-ce qu'une "chose"?

Chaque "chose" doit être un objet convexe; il ne peut pas se chevaucher. Si vous avez un objet concave, il doit donc être décomposé en morceaux convexes.

Il s'agit de la méthode standard de rendu d'une scène transparente. Résout-il les cas d'interpénétration? Non. Cela résout-il les cas où vous avez 3 objets où aucun ordre de profondeur ne peut être déterminé? Non. Cela résout-il les cas où vous avez un long objet qui chevauche un petit qui est plus proche dans sa profondeur centrale? Non.

Mais cela fonctionne assez bien . Les jeux n'utilisent pas de peeling en profondeur. Ils n'utilisent pas de k-tampons routés au pochoir. Ils n'utilisent pas de tampons F. Pourquoi? Parce que ces choses sont incroyablement lentes.

Vous pouvez obtenir des artefacts avec la méthode standard. Mais au moins, votre jeu fonctionne assez rapidement.

Si vous souhaitez vous limiter au matériel DX11 ou supérieur, il existe des moyens d'implémenter le mélange avec un tri approprié. Ils sont plus lents, mais pas aussi lents que les techniques précédentes. Et contrairement au peeling en profondeur qui peut introduire des artefacts, celui-ci est précis. De plus, les performances de l'algorithme sont généralement par fragment (et dans une certaine mesure par chevauchement au sein de chaque fragment). Donc, si vous n'avez pas dessiné beaucoup de choses transparentes, les performances sont minimes.

Je ne sais pas si la technique a un nom étrange, mais une implémentation pour pré-GL4.2 peut être trouvée ici. Une version D3D11 peut être trouvée ici (Powerpoint, PPSX, compatible Libre).

Nicol Bolas
la source
Bons points sur cette réponse. Personnellement, je m'arrangerais aussi avec assez de bien (que j'ai décrit dans ma réponse, comme étant une solution de contournement) car la plupart des techniques que j'ai énumérées sont probablement plus problématiques qu'elles n'en valent la peine. Aussi, technique intéressante à la fin, je ne pense pas qu'elle soit répertoriée sur le rendu en temps réel sur laquelle j'ai recherché ma réponse. Je suis un noob complet en ce qui concerne les fonctionnalités de niveau DX11.
David Gouveia
"une implémentation pour pré-GL4.2 peut être trouvée ici" 404
Jeroen van Langen