Leo*_*pez 6 java opengl-es stencil-buffer libgdx
我正在使用libgdx和OpenGL ES 1.0,我想知道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);
Run Code Online (Sandbox Code Playgroud)
是的 spriteBatch 确实写入了模板缓冲区,问题是我必须配置模板缓冲区。完成的方法是创建一个应用程序配置对象并在初始化应用程序时将其作为参数传递,如下所示:
对于 Android 启动器,你需要这样做:
AndroidApplicationConfiguration Configuration = new AndroidApplicationConfiguration();
Configuration.stencil = 8; //stencil buffer size
initialize(new Game(), Configuration); //pass it as parameter
Run Code Online (Sandbox Code Playgroud)
对于桌面来说是这样的
LwjglApplicationConfiguration Configuration = new LwjglApplicationConfiguration();
Configuration.stencil = 8;
new LwjglApplication(new Game(), Configuration);
Run Code Online (Sandbox Code Playgroud)