2010-06-29 16 views
7

Con il buffer stencil in opengl-es per Android, sto semplicemente cercando di mascherare il disegno di una parte dello schermo. Penso di averlo impostato correttamente, ma non sta mascherando le parti non stenciled. Di seguito è un'estrazione di codice per quello che sto facendo.Utilizzo dello stencil buffer OpenGL-ES

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); 

Qualcuno ha notato qualcosa di sbagliato in questo? Quello che fa in pratica è disegnare una casella per dire, metà dello schermo (questo funziona se avessi il colore abilitato) che sta impostando il buffer stencil su 1 per quell'area. E alla fine disegno su tutto lo schermo. Voglio che sia disegnato solo per la metà superiore, ma disegna tutto.

Grazie in anticipo.

+2

La vostra configurazione di contesto [ha nessun bit stencil buffer] (http://www.mail-archive.com/[email protected]/msg21180.html)? – genpfault

+0

Non è così. Grazie, ho pensato che fosse una funzionalità opengl richiesta. Sembra come se non lo fosse. – Moncader

risposta

4

La ragione è stata che non avevo impostato correttamente EGLConfig per supportare il buffer degli stencil.

+8

più informazioni sarebbe bello –

5

È necessario impostare lo stencilSize utilizzando setEGLConfigChooser. Si noti che telefoni diversi hanno superfici diverse che possono o meno supportare questo.

Ad esempio:

// 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

Strano. Perché non ho notato prima questa risposta? Ad ogni modo, ho avuto esattamente la stessa domanda, e ho risposto quasi allo stesso modo :-) – hirschhornsalz

2

È necessario richiedere esplicitamente stencil buffer con GLSurfaceView.setEGLConfigChooser:

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

I numeri sono rosso, verde, blu, alfa bit, profondità, stencil. RGB565 con profondità di 16 bit e stencil a 8 bit è il minimo supportato da ciascun dispositivo Android compatibile con EGL.

+0

+1 Quelle sono le profondità di bit supportate minime per i buffer di rendering ma hai trovato documentazione che dice che queste sono anche le profondità di bit minime per superfici della finestra? –

0

Questa risposta viene ripubblicata dal collegamento mostrato di seguito. Questo ha risolto per me un bug OpenGL ES2.0 in un campione.

"è necessario impostare la maschera stencil glStencilMask (0xFF) prima di chiamare glClear (GL_STENCIL_BUFFER_BIT) per cancellare tutti i bit di stencil buffer."

android opengl 2.0 stencil buffer not working