5

テクスチャの透明な長方形を削除(切り取り)して、穴が半透明になるようにする方法。

Androidでは、Xfermodesアプローチを使用します。

Androidでマスクを使用する方法

しかし、libgdxではopenglを使用する必要があります。これまでのところ、glBlendFuncを使用して、探していたものをほぼ達成しました。この素敵で非常に役立つページから、私はそれを学び ます

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

マスク部分を真っ黒にしているだけなのに、透明感やアイデアを期待していました。

これは私が得るものです:

マスクは黒く描かれます

これは私が期待したことです:

マスク領域は透明である必要があります

4

1 に答える 1

2

ステンシルバッファを使用して問題を解決しました。

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);
于 2013-03-10T00:45:14.920 に答える