2012-04-29 18 views
11

Por favor considere las siguientes imágenes para la ilustración: enter image description hereproducir efectos borrador utilizando libgdx y OpenGL ES

principio me llenan toda la pantalla/escenario con imágenes individuales hasta que la pantalla se vuelve de color rosa. Cada gota de color rosa es un actor de imagen individual que agrego al escenario.

Ahora quiero implementar el método touchDown de tal forma que cada vez que el usuario toque la pantalla, borre una parte de esa imagen donde tuvo lugar el evento táctil. Sin embargo, ese evento táctil no debería afectar a otras imágenes/actores/TextureRegions que estén detrás o por encima de los actores de blob rosa. ¿Cómo se supone que lograr esto en libgdx usando OpenGL ES? Por favor, ayúdame en este sentido.

Encontré este enlace que explica cómo modificar un TextureRegion pero no sé cómo voy a lograr la solución para mi problema utilizando la técnica explicada en este blog. Here is the link

+0

El tacto, ¿quieres que la imagen completa a ser "borrado"? ¿Borrar significa escribir valores blancos en los píxeles o hacerlos transparentes? ¿Estás usando OpenGL ES 2? libgdx parece apoyarlo. –

+0

@StefanHanke No. Tengo la intención de borrar solo una parte de la imagen donde ocurrió el evento táctil. Y quiero hacerlos transparentes en lugar de colorearlos en blanco para que el fondo se vuelva visible. – Rafay

+0

Podría ser más fácil si sabes qué color se va a borrar ahora ... – Ronnie

Respuesta

5

¿Podría usar los FBO y un buffer de estarcido?

Configure un FBO para su capa "rosa" y un buffer de esténcil para ello. Al tocar hacia abajo, dibuja tu toque como una máscara en el tampón del esténcil del FBO rosa. Ahora, cuando dibujas el FBO rosado, las áreas que tocas no se mostrarán para que puedas ver el FBO de fondo detrás de él.

Este enlace http://www.opengl.org/archives/resources/faq/technical/rasterization.htm, sección 14.050 le indica cómo configurar un stencil buffer:

Puede configurar el estado de OpenGL de la siguiente manera:

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

prestación subsiguiente establecer un bit 1 en el galería de símbolos para cada píxel prestados.

Es posible que tenga que jugar con las cosas de modo que su enmascaramiento salga de la manera correcta (máscaras donde se tocaron, no donde no lo hizo.)

+0

La idea de tres apilados (XYZ) es exactamente lo que quiero. Ahora que está discutiendo los buffers aquí, ¿la operación sería lo suficientemente fluida como para no causar que el hilo de renderizado cree una inestabilidad notable? Como soy relativamente nuevo en OpenGL ES, no tengo idea de cómo funcionan los almacenamientos intermedios, así que tendría que probar cosas desde cero. Lo que pasa es que debo estar seguro de que este enfoque es el mejor para lo que quiero hacer aquí. En lo que respecta a los buffers de FBO y stencil, sí puedo usarlos, pero no sé cómo. A continuación hay algunas referencias para FBO's y stencil buffer dentro del marco. – 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 Ya estoy buscando cómo hacerlo utilizando búferes como ha sugerido. – Rafay

+1

Ahora que lo pienso un poco más, realmente no necesitas tres FBO, solo una con un buffer de stencil para que coincida. He editado la pregunta para ser mejor. Esta respuesta tiene algunas características sobre el rendimiento de FBO http://stackoverflow.com/a/2203931/959304 pero simplemente ignoraría el rendimiento hasta que funcione, y si el rendimiento empeora, _then_ pagará la complejidad de código adicional que vendrá cuando lo desee Para optimizar. – Soup