2011-08-12 1 views
1

J'essaie de faire fonctionner correctement les tests de profondeur sur OpenGL ES, en utilisant l'extension draw_texture. J'ai réalisé très tôt que les coordonnées z «normales», lorsqu'elles sont rendues en utilisant cette extension, ne fonctionnent pas. Ceci est dû à l'extension en utilisant efficacement la coordonnée Z comme un rapport entre 0 et 1 au lieu de la position z réelle dans le tampon de profondeur, comme indiqué par la page de texture dessiner OpenGL OES:Solution de contournement pour les tests de transparence et de profondeur dans OpenGL ES?

Zs est mis en correspondance profondeur de la fenêtre Zw comme suit:

   { n,     if z <= 0 
     Zw = { f,     if z >= 1 
      { n + z * (f - n), otherwise 

where <n> and <f> are the near and far values of 
DEPTH_RANGE. 

J'ai lu sur la page FAQ pour la transparence OpenGL:

Lors de l'utilisation de mémoire tampon dans la profondeur d'une application, vous devez être prudent sur l'ordre dans lequel vous rendez les primitives. Les primitives entièrement opaques doivent être rendues en premier, suivies des primitives partiellement opaques dans l'ordre inverse. Si vous ne rendez pas les primitives dans cet ordre, les primitives, qui seraient autrement visibles via une primitive partiellement opaque , risquent de perdre complètement le test de profondeur.

Cela m'amène à mon problème. J'ai 2 carrés, tous les deux 64x64. Ils sont texturés avec un cercle. Le carré «sur le dessus» est placé légèrement plus bas du carré ci-dessous comme si.

___________ 
| .____. | 
|/ \ | 
|_|______|_| 
| .____. | 
|/ \ | 
| | s | | 
| \____/ t| 
|__________| 

La texture du cercle est une couleur unie qui forme le cercle, puis une zone environnante complètement transparente (t). Lorsque OpenGL le restitue, le carré en dessous échoue au test de profondeur et n'est pas dessiné, même si les pixels au-dessus sont transparents. Vous obtenez donc un effet demi-cercle du calque inférieur et non de l'image entière.

BAD     GOOD 
___________   ___________ 
| .____. |   | .____. | 
|/ \ |   |/ \ | 
|_|______|_|   |_|  |_| 
| .____. |   | \.____./ | 
|/ \ |   |/ \ | 
| |  | |   | |  | | 
| \____/ |   | \____/ | 
|__________|   |__________| 

Comment puis-je empêcher que cela se produise?

+0

La combinaison de gl.glEnable (GL10.GL_ALPHA_TEST); gl.glAlphaFunc (GL10.GL_GREATER, 0,0f); fonctionne dans une certaine mesure, mais toute partie de la texture avec alpha> 0 et <255 sera traitée comme auparavant comme un objet solide, donc une bordure transparente autour du bord de la texture du cercle devient visible car il y a une période de transition dans la texture (ne pas simplement couper directement du cercle à transparent). – Dororo

+0

réglage glAlphaFunc à 0,2 a bien fonctionné pour moi, et a pratiquement répondu à cette question. – Dororo

Répondre

2

On crée:

gl.glEnable(GL10.GL_ALPHA_TEST); 
gl.glAlphaFunc(GL10.GL_GREATER,0.2f); 

Ce résout le problème, mais vous devrez peut-être changer à 0.2f plus ou moins en fonction de vos textures.

+0

Ça fait gagner beaucoup de temps pour moi. Merci. – Behnam

Questions connexes