2010-06-29 13 views
7

Mit dem Stencil Buffer in opengl-es für Android versuche ich nur, den Teil des Bildschirms auszublenden. Ich denke, ich habe es richtig eingerichtet, aber es maskiert die nicht schablonierten Teile nicht. Unten ist eine Extraktion von Code für das, was ich mache.Erste Schritte mit dem OpenGL-ES Stencil Buffer

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

Wer etwas falsch mit diesem Punkt? Was es tut ist im Grunde eine Box für sagen, die Hälfte des Bildschirms (das funktioniert, wenn ich Farbe aktiviert hatte), die den Stencil-Puffer auf 1 für diesen Bereich setzt. Und am Ende zeichne ich auf den ganzen Bildschirm. Ich möchte, dass es nur in die obere Hälfte zieht, aber es zieht alles an.

Vielen Dank im Voraus.

+2

Gibt es in Ihrer Kontextkonfiguration [irgendwelche Stencilbuffer Bits] (http://www.mail-archive.com/[email protected]/msg21180.html)? – genpfault

+0

Es tut es nicht. Danke, ich dachte, es wäre eine OpenGL-Funktion. Es scheint, als ob es nicht ist. – Moncader

Antwort

4

Der Grund war, dass ich meine EGLConfig nicht korrekt eingestellt hatte, um den Stencil Buffer zu unterstützen.

+8

mehr Info wäre nett –

5

Sie müssen die Schablonengröße mit setEGLConfigChooser festlegen. Beachten Sie, dass verschiedene Telefone unterschiedliche Oberflächen haben, die dies unterstützen können oder nicht.

Zum Beispiel:

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

Seltsam. Warum habe ich diese Antwort nicht schon früher bemerkt? Wie auch immer, ich hatte genau die gleiche Frage, und ich antwortete fast auf die gleiche Weise :-) – hirschhornsalz

2

Sie müssen explizit die Schablonenpuffer mit GLSurfaceView.setEGLConfigChooser anfordern:

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

Die Zahlen sind rot, grün, blau, alpha, Tiefe, Schablone Bits. RGB565 mit 16 Bit Tiefe und 8-Bit-Schablone ist das Minimum, das von jedem EGL-fähigen Android-Gerät unterstützt wird.

+0

+1 Das sind die minimal unterstützten Bittiefen für Render-Puffer, aber haben Sie eine Dokumentation gefunden, die besagt, dass dies auch die minimalen Bit-Tiefen für sind Fensterflächen? –

0

Diese Antwort wurde aktualisiert über den unten gezeigten Link. Dies behebt einen OpenGL ES2.0 Bug in einer Probe für mich.

"Es ist notwendig, Schablone glStencilMask (0xff) vor dem Aufruf glClear (GL_STENCIL_BUFFER_BIT) einzustellen maskiert alle Bits Stencilbuffer zu löschen."

android opengl 2.0 stencil buffer not working