2013-02-27 11 views
5

Jak usunąć (wyciąć) przezroczysty prostokąt w strukturze, aby otwór był przezroczysty.Wytnij półprzezroczysty kwadrat w strukturze

Na Androidzie użyłbym podejście Xfermodes:

How to use masks in android

Ale w libgdx będę musiał użyć OpenGL. Do tej pory prawie osiągnąć to, czego się szuka, używając do glBlendFunc Od tego miły i bardzo pomocny page I learend że

glBlendFunc(GL_ZERO, GL_ONE_MINUS_SRC_ALPHA); 

powinno rozwiązać mój problem, ale próbowałem go, i nie dość pracy zgodnie z oczekiwaniami:

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

To właśnie czyni obszar maski zwykły czarny, podczas gdy ja spodziewałem przejrzystość, żadnych pomysłów.

To co mam:

Mask will be drawn black

to, czego się spodziewałem:

Mask area should be transparent

+1

Czy masz dla nas fragment kodu? Będzie lepiej dla zrozumienia twojego pytania. –

+0

hmm dobrze pomyślałem o jakimś fragmencie, ale do tej pory nie miałem do czynienia, dlatego miałem nadzieję, że ogólne pytanie jest bardziej użyteczne. Ale do tej pory udokumentuję moją ofertę. – joecks

+0

Otrzymuję efekt zwykłej czarnej maski z witryny 'glblendfunc.php' dla parametrów' setBlendFunc'. Czy możesz dołączyć zrzut ekranu tego, co dostajesz lub czego chcesz? (Uwaga: na stronie 'glblendfunc.php'" pierwszy plan "ma taki sam rozmiar jak" tło ", więc cała alfa pierwszego planu jest zastosowana do całego tła.) –

Odpowiedz

1

mi rozwiązać mój problem stosując bufor szablonowy:

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