2013-02-27 5 views
5

So entfernen Sie ein transparentes Rechteck in einer Textur (ausgeschnitten), so dass das Loch durchscheinend ist.Ausschneiden eines transluzenten Quadrats in einer Textur

Auf Android würde ich den Xfermodes Ansatz verwenden:

How to use masks in android

Aber in Libgdx werde ich opengl verwenden. Bisher fast ich erreicht, was ich suchte, durch die die glBlendFunc mit Von diesem schönen und sehr hilfreich page ich learend dass

glBlendFunc(GL_ZERO, GL_ONE_MINUS_SRC_ALPHA); 

sollte mein Problem lösen, aber ich versuchte es aus, und es hat nicht ganz funktioniert wie erwartet:

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

Es macht nur der Maskenbereich schlichtes schwarz, während ich Transparenz erwartet wurde, keine Ideen.

Dies ist, was ich bekommen:

Mask will be drawn black

Dies ist, was ich erwartet hatte:

Mask area should be transparent

+1

Hast du bitte einen Code für uns? Wird besser sein, um Ihre Frage zu verstehen. –

+0

hmm Nun, ich habe über ein kleines Schnipsel nachgedacht, aber ich habe bisher noch keinen Ansatz, daher habe ich gehofft, dass eine generische Frage nützlicher ist. Aber ich werde mein bisheriges leisten. – joecks

+0

Ich bekomme den plain-black-mask-Effekt von der 'glblendfunc.php' Seite für diese' setBlendFunc' Parameter. Kannst du einen Screenshot von dem, was du bekommst oder was du willst, anhängen? (Beachten Sie auch, dass auf der Website "glblendfunc.php" der "Vordergrund" dieselbe Größe wie der "Hintergrund" hat, also wird der volle Alpha des Vordergrunds auf den gesamten Hintergrund angewendet.) –

Antwort

1

ich mein Problem gelöst, indem Sie den Schablonenpuffer:

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); 
Verwandte Themen