Libgdx是否可以将SpriteBatch绘制到模板缓冲区?

6
我正在使用OpenGL ES 1.0版本的libgdx,并想知道SpriteBatch是否可以将图像写入/绘制到模板缓冲区。我一直在尝试写入模板缓冲区,但是没有任何结果。虽然我阅读了很多关于模板缓冲区的资料,但并没有实际经验, 如果我的理解有误请指出。基本上,我想做的是使用SpriteBatch将纹理绘制到模板缓冲区中,这样当我绘制其他东西(不启用模板缓冲区)时,它只会被绘制到与模板缓冲区等于1的区域。

这是我期望的效果: 如果我将一个带有星形的纹理绘制到模板缓冲区,然后再将一个红色纹理绘制到颜色缓冲区,我希望红色纹理在模板缓冲区中包含星形的像素处不会被绘制。

以下是我目前的代码:

   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);
1个回答

3

是的,spriteBatch确实会向模板缓冲区写入内容,但问题在于我需要配置模板缓冲区。配置方式是通过创建一个应用程序配置对象,并将其作为参数传递给应用程序初始化时完成,如下所示:

对于Android启动器,需要按照以下方式执行:

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

对于桌面应用程序而言,它是这个样子的

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接