2012-04-29 15 views
11

Si prega di prendere in considerazione le seguenti immagini per il dell'illustrazione: enter image description hereproducendo effetti gomma utilizzando libgdx e OpenGL ES

Inizialmente ho riempire l'intero schermo/palcoscenico con le singole immagini fino a quando lo schermo diventa rosa. Ogni blob di colore rosa è un singolo attore Image che aggiungo al palco.

Ora voglio implementare il metodo touchDown in modo tale che ogni volta che l'utente tocca lo schermo, cancella una parte dell'immagine in cui si è verificato l'evento di tocco. Tuttavia, quell'evento di tocco non dovrebbe influenzare altre Immagini/attori/TextureRegions che si trovano dietro o sopra gli attori blob rosa. Come posso ottenere questo risultato in libgdx usando OpenGL ES? Per favore aiutami in questo senso.

Ho trovato questo collegamento che spiega come modificare un TextureRegion ma non so come raggiungerò la soluzione per il mio problema utilizzando la tecnica spiegata in questo blog. Here is the link

+0

Sul tocco, vuoi l'immagine completa di essere "cancellati"? Cancellare significa scrivere valori bianchi sui pixel o renderli trasparenti? Stai usando OpenGL ES 2? libgdx sembra supportarlo. –

+0

@StefanHanke No. Ho intenzione di cancellare solo una parte dell'immagine in cui si è verificato l'evento tattile. E voglio renderli trasparenti piuttosto che colorarli di bianco in modo che lo sfondo diventi visibile. – Rafay

+0

Potrebbe essere più facile se sapete quale colore verrà cancellato ora .. – Ronnie

risposta

5

È possibile utilizzare FBO e un buffer stencil?

Impostare un FBO per il livello "rosa" e un buffer stencil per esso. Al tocco in giù, disegna il tuo tocco come maschera per il buffer degli stencil dell'FBO rosa. Ora, quando disegni l'FBO rosa, le aree che hai toccato non saranno renderizzate, così potrai vedere lo sfondo dell'FBO dietro di esso.

Questo link http://www.opengl.org/archives/resources/faq/technical/rasterization.htm, sezione 14,050 ti dice come impostare un buffer di stencil:

È possibile impostare lo stato OpenGL come segue:

glEnable(GL_STENCIL_TEST); 
glStencilFunc(GL_ALWAYS, 0x1, 0x1); 
glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE); 

resa successivi saranno impostare un 1 bit nel buffer stencil per ogni pixel reso.

Potrebbe essere a giocherellare con le cose in modo che il mascheramento viene fuori nel modo giusto (maschere in cui si toccavano, non dove non l'hai fatto.)

+0

L'idea di tre stack (XYZ) è esattamente quello che voglio. Ora che stai discutendo dei buffer, l'operazione dovrebbe essere abbastanza fluida da non far sì che il thread di rendering crei un jitter notevole? Dato che sono relativamente nuovo a OpenGL ES, non ho idea di come funzionano i buffer, quindi dovrei provare le cose da zero. Il fatto è che devo essere sicuro che questo approccio è il migliore per quello che voglio fare qui. Per quanto riguarda i buffer degli FBO e degli stencil, sì, posso usarli ma non so come. Di seguito sono riportati alcuni riferimenti per FBO e buffer stencil all'interno del framework. – Rafay

+0

http://libgdx.l33tlabs.org/docs/api/com/badlogic/gdx/graphics/glutils/FrameBuffer.html http://libgdx.l33tlabs.org/docs/api/com/badlogic/gdx/ utils/BufferUtils.html http://www.badlogicgames.com/wordpress/?p=1923 Sto già cercando su come farlo utilizzando i buffer come suggerito. – Rafay

+1

Ora che ci penso un po 'di più, non hai davvero bisogno di tre FBO, solo uno con un buffer stencil da abbinare. Ho modificato la domanda per essere migliore. Questa risposta ha alcune informazioni sulle prestazioni dell'FBO http://stackoverflow.com/a/2203931/959304 ma vorrei ignorare le prestazioni fino al suo funzionamento, e se le prestazioni peggiorano, _ allora pagherai il codice in più, la complessità che arriverà quando vuoi ottimizzare. – Soup