2014-06-19 1 views
4

J'essaie de dessiner une sphère avec alpha, mais j'ai un problème avec mon Z-buffer. Certains pixels sont transparents mais écrivent dans le Zbuffer de sorte qu'un pixel opaque juste derrière est caché.OpenGl alpha test - Comment remplacer AlphaFunc obsolète?

Voici mes paramètres:

gl Enable: gl DEPTH_TEST. 
gl DepthFunc: gl LEQUAL. 
gl Disable: gl CULL_FACE. 
gl Enable: gl BLEND. 
gl BlendFunc: gl SRC_ALPHA with: gl ONE_MINUS_SRC_ALPHA. 

que je connais la fonction glAlphaFunc(GREATER, aFloat) et enable(ALPHA_TEST) peut le faire, mais je lis que c'est une fonction dépréciée depuis la version 3.1 d'OpenGL. Comment puis-je faire un rendu correct sans utiliser ALPHAFunc? Est-ce que quelqu'un connaît un truc, ou un moyen de le faire via les shaders?

+2

Dans GL moderne vous êtes censé faire dans shader fragment, par exemple 'if (result.a> threshold) rejeter; – keltar

+0

Votre question est très similaire à celle-ci: http://stackoverflow.com/questions/23280692/opengl-es2-alpha-test-problems/23283256. Je ne vais pas le suggérer comme un duplicata pour le moment car c'est un cas d'utilisation légèrement différent. Mais ma réponse dans cette question devrait toujours s'appliquer à votre cas. –

Répondre

10

Ceci est très facile à mettre en œuvre dans un fragment shader:

uniform float alpha_threshold; 

void main() { 
    vec4 color = ...; 

    if(color.a <= alpha_threshold) // Or whichever comparison here 
     discard; 

    gl_FragColor = color; 
}