2013-02-27 16 views
5

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

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

How to use masks in android

しかしlibgdxに、私はOpenGLを使用する必要があります。これまでのところ私はほとんど私が

glBlendFunc(GL_ZERO, GL_ONE_MINUS_SRC_ALPHA); 

は私の問題を解決する必要があることをlearendこの素晴らしく、非常に参考にpageからglBlendFuncを使用して、探していたものを実現し、私はそれを試してみた、そしてそれは非常に仕事しませんでした

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

まあまあ、私はいくつかのスニペットについて考えましたが、これまでのところアプローチがないので、一般的な質問がより有用であることを期待しました。しかし、これまでの私の余裕は文書化します。 – joecks

+0

'glblendfunc.php'サイトから' setBlendFunc'パラメータ用のプレーンブラックマスク効果を得ました。あなたはあなたが得ているもの、またはあなたが望むもののいずれかのスクリーンショットを添付できますか? (また、 'glblendfunc.php'サイトでは、"フォアグラウンド "は"バックグラウンド "と同じサイズですので、フォアグラウンドのフルアルファがバックグラウンド全体に適用されます) –

答えて

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); 
関連する問題