2012-10-13 221 views
6

Estoy usando libgdx con OpenGL ES 1.0 y me pregunto si el SpriteBatch puede escribir/dibujar en el buffer de esténcil. He estado tratando de escribir y no obtengo ningún resultado, no tengo experiencia en usar el buffer de esténcil, pero he estado leyendo mucho, así que corrígeme si me equivoco en lo que sigue. Básicamente lo que quiero hacer es dibujar una textura con un SpriteBatch en el buffer de la plantilla así que cuando dibujo algo más (con el stencil buffer desactivado) Solo se dibuja en las regiones donde el buffer de esténcil es 1.Libgdx ¿SpriteBatch se basa en StencilBuffer?

Este es mi resultado deseado: Si dibujo una textura con forma de estrella en el buffer de la plantilla y luego dibujo una textura roja en el buffer de color, quiero que la textura roja omita los píxeles donde está la estrella en el buffer de esténcil.

Este es mi código hasta ahora:

batch.begin(); 
    Gdx.gl10.glEnable(GL10.GL_STENCIL_TEST); 
    Gdx.gl10.glEnable(GL10.GL_ALPHA_TEST); 
    Gdx.gl10.glStencilFunc(GL10.GL_ALWAYS, 0x1, 0xffffffff); 
    Gdx.gl10.glStencilOp(GL10.GL_REPLACE, GL10.GL_REPLACE, GL10.GL_REPLACE); 
    Gdx.gl10.glColorMask(false, false, false, false); 

    batch.draw(myShape, 100, 100); //draw to the stencil buffer a shape (texture region) 

    batch.end(); 
    batch.begin(); 

    Gdx.gl10.glColorMask(true, true, true, true); 
    Gdx.gl10.glStencilOp(GL10.GL_KEEP, GL10.GL_KEEP, GL10.GL_KEEP); 

    // draw where the shape has NOT been drawn 
    Gdx.gl10.glStencilFunc(GL10.GL_NOTEQUAL, 0x1, 0xff); 

    batch.draw(BackGroundLayer, 0, 0);// draw background 

    Gdx.gl10.glDisable(GL10.GL_STENCIL_TEST); 

Respuesta

3

sí SpriteBatch sí escribe a la plantilla a amortiguar el problema era que tenía para configurar el stencil buffer. La forma en que se lleva a cabo es mediante la creación de un objeto de aplicación configuratioin y pasándolo como parámetro al inicializar la aplicación como esta:

Para el lanzador androide necesita hacerlo de esta manera:

AndroidApplicationConfiguration Configuration = new AndroidApplicationConfiguration(); 
Configuration.stencil = 8; //stencil buffer size 
initialize(new Game(), Configuration); //pass it as parameter 

Para el escritorio es así

LwjglApplicationConfiguration Configuration = new LwjglApplicationConfiguration(); 
Configuration.stencil = 8; 
new LwjglApplication(new Game(), Configuration);