2010-06-29 33 views
7

Con el búfer de stencil en opengl-es para Android, simplemente estoy tratando de enmascarar el dibujo de una parte de la pantalla. Creo que lo tengo configurado correctamente, pero no está enmascarando las partes sin estarcido. Debajo hay una extracción de código para lo que estoy haciendo.Obteniendo el búfer de plantillas de OpenGL-ES trabajando

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

¿Alguien encuentra algo malo con esto? Lo que hace básicamente es dibujar un recuadro para decir, la mitad de la pantalla (esto funciona si tenía el color habilitado) que está configurando el buffer de esténcil en 1 para esa área. Y al final dibujo a toda la pantalla. Quiero que dibuje solo a la mitad superior, pero dibuja todo.

Gracias de antemano.

+2

¿Su configuración contexto [tiene ningún bits de amortiguamiento de la plantilla] (http://www.mail-archive.com/[email protected]/msg21180.html)? – genpfault

+0

No es así. Gracias, pensé que era una característica OpenGL requerida. Parece que no lo es. – Moncader

Respuesta

4

La razón terminó siendo que no había configurado mi EGLConfig correctamente para admitir el buffer de stencil.

+8

más información sería bueno –

5

Tiene que establecer stencilSize usando setEGLConfigChooser. Tenga en cuenta que diferentes teléfonos tienen diferentes superficies que pueden o no soportar esto.

Por ejemplo:

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

Extraño. ¿Por qué no noté esta respuesta antes? De todos modos, tenía exactamente la misma pregunta, y respondí casi de la misma manera :-) – hirschhornsalz

2

necesita solicitar explícitamente la memoria intermedia de la plantilla con GLSurfaceView.setEGLConfigChooser:

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

Los números son de color rojo, verde, azul, los bits de alfa, la profundidad, de la plantilla. RGB565 con profundidad de 16 bits y plantilla de 8 bits es el mínimo compatible con cada dispositivo Android con capacidad EGL.

+0

+1 Esas son las profundidades mínimas admitidas para los búfers de renderizado, pero ¿encontró alguna documentación que diga que estas son también las profundidades mínimas de bits para superficies de las ventanas? –

0

Esta respuesta se publica nuevamente en el enlace que se muestra a continuación. Esto solucionó un error de OpenGL ES2.0 en una muestra para mí.

"es necesario para establecer la plantilla máscara glStencilMask (0xff) antes de llamar glClear (GL_STENCIL_BUFFER_BIT) para borrar todos los bits del stencil buffer".

android opengl 2.0 stencil buffer not working

Cuestiones relacionadas