2010-11-29 5 views
8

Je réalise la transparence d'objet de base en utilisant le tri par profondeur. Comme profondeur j'utilise la distance (au carré) de la caméra à chaque centre des triangles du modèle, que je calcule comme {(x1 + x2 + x3)/3, (y1 + y2 + y3)/3, (z1 + z2 + z3)/3}. Bien que le résultat soit presque parfait, il y a quelques erreurs.Tri de profondeur OpenGL

tête de singe sans tri no sorting

avec tri sorting

Est-ce que je peux faire ces erreurs?

+1

Pipeline à fonction fixe ou programmable? – genpfault

+0

corrigé. Je fais un tableau de distance, puis je le trie et permute les valeurs correspondantes dans le tableau indices, glDrawElements à la fin. – spacevillain

Répondre

6

Il n'y a aucun moyen de trier les triangles de manière parfaite. Regardez les exemples à la fin de l'article Transparency Sorting sur le wiki opengl.org.

@kos: Jetez un oeil à Order Independent Transparency with Dual Depth Peeling et Alpha to Coverage.

+0

Donc, il n'y a toujours pas une seule solution pour rendre la transparence arbitraire correctement? – Kos

+1

@Kos: vérifiez http://www.yakiimo3d.com/2010/07/19/dx11-order-independent-transparency/ et http://blog.icare3d.org/2010/07/opengl-40-abuffer- v20-linked-lists-of.html – Stringer

2

À moins d'avoir des particules alignées sur l'écran, il est vraiment difficile de trier des triangles arbitraires. Pour un résultat parfait, vous devez commencer à diviser les triangles. Comme @tibur dit, vous pouvez vous en tirer avec quelques approximations simples mais order-independent transparency (OIT) est également une solution décente. Il nécessite cependant des fonctionnalités graphiques OpenGL 3 ère. J'ai un implementation available on github, qui montre quelques façons de faire exact OIT assez rapidement.

Il est intéressant de regarder "adaptive transparency", "multi-layer alpha blending" et "hybrid transparency". Ce sont des solutions approximatives rapides mais donnent de très bons résultats pour des scènes communes.


Quelques questions similaires ...

0

Mathématiquement parlant, si vous savez quelque chose sur le corps, il pourrait aider le tri. Par exemple, les faces d'un cube peuvent être triées en profondeur par barycentre (face centre) seul. Si le centre de la face A est plus proche que le centre de B, B n'aura jamais de partie devant A (encore une fois pour un cube.)

En fait, pour un corps convexe, les faces peuvent être trié par orientation seul.

Questions connexes