在纹理中切出半透明的正方形

时间:2013-02-27 16:56:43

标签: java android opengl-es libgdx

如何在纹理中移除(剪切)透明矩形,以便孔将是半透明的。

在Android上我会使用Xfermodes方法:

How to use masks in android

但是在libgdx中我将不得不使用opengl。到目前为止,我几乎达到了我想要的,通过使用glBlendFunc来自这个很好且非常有帮助的page我认为

glBlendFunc(GL_ZERO, GL_ONE_MINUS_SRC_ALPHA);

应该可以解决我的问题,但我尝试了它,并且它没有按预期工作:

batch.end();
batch.begin();
//Draw the background
super.draw(batch, x, y, width, height);
batch.setBlendFunction(GL20.GL_ZERO,
        GL20.GL_ONE_MINUS_SRC_ALPHA);

//draw the mask
mask.draw(batch, x + innerButtonTable.getX(), y
        + innerButtonTable.getY(), innerButtonTable.getWidth(),
        innerButtonTable.getHeight());

batch.end();
batch.setBlendFunction(GL20.GL_SRC_ALPHA,
        GL20.GL_ONE_MINUS_SRC_ALPHA);
batch.begin();

这只是使面具区域变成黑色,而我期待透明度,任何想法。

这就是我得到的:

Mask will be drawn black

这就是我的预期:

Mask area should be transparent

1 个答案:

答案 0 :(得分:1)

我通过使用模板缓冲区解决了我的问题:

Gdx.gl.glClear(GL_STENCIL_BUFFER_BIT);
batch.end();
//disable color mask
Gdx.gl.glColorMask(false, false, false, false);
Gdx.gl.glDepthMask(false);
//enable the stencil
Gdx.gl.glEnable(GL20.GL_STENCIL_TEST);
Gdx.gl.glStencilFunc(GL20.GL_ALWAYS, 0x1, 0xffffffff);
Gdx.gl.glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);

batch.begin();
//draw the mask
mask.draw(batch, x + innerButtonTable.getX(), y
        + innerButtonTable.getY(), innerButtonTable.getWidth(),
        innerButtonTable.getHeight());

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

//enable color mask 
Gdx.gl.glColorMask(true, true, true, true);
Gdx.gl.glDepthMask(true);
//just draw where outside of the mask
Gdx.gl.glStencilFunc(GL_NOTEQUAL, 0x1, 0xffffffff);
Gdx.gl.glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
//draw the destination texture
super.draw(batch, x, y, width, height);
batch.end();
//disable the stencil
Gdx.gl.glDisable(GL20.GL_STENCIL_TEST);