2010-06-29 5 views
7

Avec le tampon stencil dans opengl-es pour Android, j'essaie simplement de masquer le dessin d'une partie de l'écran. Je pense que je l'ai mis en place correctement, mais il ne masque pas les parties non-pochoir. Voici une extraction de code pour ce que je fais.Obtention du tampon Stencil OpenGL-ES Fonctionnement

gl.glEnable(GL10.GL_STENCIL_TEST); 
gl.glClearStencil(0); 
gl.glClear(GL10.GL_STENCIL_BUFFER_BIT); 
gl.glColorMask(false, false, false, false); 
gl.glDepthMask(false); 
gl.glStencilFunc(GL10.GL_ALWAYS, 1, 1); 
gl.glStencilOp(GL10.GL_REPLACE, GL10.GL_REPLACE, GL10.GL_REPLACE); 

drawMask(); //I have confirmed this draws to the correct location by allowing colour to show. Trust that this draws the mask to the correct location. 

gl.glColorMask(true, true, true, true); 
gl.glDepthMask(true); 
gl.glStencilFunc(GL10.GL_EQUAL, 1, 1); 
gl.glStencilOp(GL10.GL_KEEP, GL10.GL_KEEP, GL10.GL_KEEP); 

drawItems(); //Draw everything. Only items inside the masked area should be drawn. But everything is drawn with this code... 

gl.glDisable(GL10.GL_STENCIL_TEST); 

Quelqu'un at-il quelque chose de mal à cela? Qu'est-ce qu'il fait essentiellement est de dessiner une boîte pour dire, la moitié de l'écran (cela fonctionne si j'avais la couleur activée) qui définit le tampon stencil à 1 pour cette zone. Et à la fin, je dessine sur tout l'écran. Je veux que ça ne dessine que dans la moitié supérieure, mais ça attire tout.

Merci d'avance.

+2

Votre configuration de contexte [ont des bits de mémoire tampon pochoir] (http://www.mail-archive.com/[email protected]/msg21180.html)? – genpfault

+0

Ce n'est pas le cas. Merci, je pensais que c'était une fonctionnalité opengl nécessaire. On dirait que ce n'est pas le cas. – Moncader

Répondre

4

La raison a fini par être que je n'avais pas correctement configuré mon EGLConfig pour supporter le tampon stencil.

+8

plus d'infos serait bien –

5

Vous devez définir stencilSize à l'aide de setEGLConfigChooser. Notez que les téléphones différents ont des surfaces différentes qui peuvent ou ne peuvent pas supporter cela.

Par exemple:

// void android.opengl.GLSurfaceView.setEGLConfigChooser(int redSize, int greenSize, int blueSize, int alphaSize, int depthSize, int stencilSize) 
    mGLSurfaceView.setEGLConfigChooser(8, 8, 8, 8, 16, 8); 
+0

Etrange. Pourquoi n'ai-je pas remarqué cette réponse plus tôt? Quoi qu'il en soit, j'avais exactement la même question, et j'ai répondu presque de la même manière :-) – hirschhornsalz

2

Vous devez demander explicitement le tampon de pochoir avec GLSurfaceView.setEGLConfigChooser:

public class MyActivity extends Activity { 
    GLSurfaceView view; 
    ... 
    onCreate(... 
     view.setEGLConfigChooser(5,6,5,0,16,8); 
     view.setRenderer(... 

Les chiffres sont rouge, vert, bleu, alpha, profondeur, des morceaux de pochoir. RGB565 avec une profondeur de 16 bits et un stencil de 8 bits est le minimum pris en charge par chaque appareil Android compatible EGL.

+0

+1 Ce sont les profondeurs de bits minimales supportées pour les tampons de rendu mais avez-vous trouvé une documentation qui dit que ce sont aussi les profondeurs minimales pour surfaces de fenêtres? –

0

Cette réponse est reprise du lien ci-dessous. Cela a corrigé un bug OpenGL ES2.0 dans un échantillon pour moi.

"Il est nécessaire de mettre le masque pochoir glStencilMask (0xff) avant d'appeler glClear (GL_STENCIL_BUFFER_BIT) pour effacer tous les bits de tampon de pochoir."

android opengl 2.0 stencil buffer not working