2013-02-27 15 views
5

Come rimuovere (ritagliare) un rettangolo trasparente in una Texture, in modo che il foro risulti traslucido.Tagliare un quadrato traslucido in una trama

Su Android vorrei usare l'approccio Xfermodes:

How to use masks in android

Ma in libgdx dovrò usare OpenGL. Finora ho quasi raggiunto quello che stavo cercando, tramite il glBlendFunc Da questo bello e molto utile page ho learend che

glBlendFunc(GL_ZERO, GL_ONE_MINUS_SRC_ALPHA); 

dovrebbe risolvere il mio problema, ma ho provato, e non ha abbastanza lavoro come previsto:

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

Si sta semplicemente rendendo l'area della maschera completamente nera, mentre mi aspettavo trasparenza, qualsiasi idea.

Questo è ciò che ottengo:

Mask will be drawn black

Questo è quello che mi aspettavo:

Mask area should be transparent

+1

Hai un pezzo di codice per noi, per favore? Sarà meglio per capire la tua domanda. –

+0

hmm bene, ho pensato a qualche frammento ma non ho alcun approccio fino ad ora, quindi spero che una domanda generica sia più utile. Ma documenterò i miei permessi fino ad ora. – joecks

+0

Ottengo l'effetto plain-black-mask dal sito 'glblendfunc.php' per quei parametri' setBlendFunc'. Puoi allegare uno screenshot di ciò che stai ricevendo o di quello che vuoi? (Inoltre, nota al sito 'glblendfunc.php' il" primo piano "ha le stesse dimensioni dello" sfondo ", quindi l'intero alfa del primo piano viene applicato all'intero sfondo.) –

risposta

1

ho risolto il mio problema utilizzando lo stencil buffer:

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