2009-11-11 20 views
6

Escribo aplicaciones gráficas para el iPhone y estoy buscando portar mi aplicación más reciente, 'Capas', a la plataforma Android. Layers es una aplicación de pintura que permite a los usuarios dibujar en la pantalla y crear pinturas de varias capas con diferentes pinceles, colores, etc. y exportar a PSD. Tiene sincronización de escritorio, una herramienta de borrón, muchas cosas buenas ... http://www.layersforiphone.com/Android OpenGLES Renderizar para texturizar

Empecé a mirar la plataforma Android el lunes y me encontré con un gran problema. Uso OpenGL para hacer todo el dibujo porque ofrece el mejor rendimiento. Sin embargo, hay varios lugares donde necesito renderizar una textura y luego usar la textura. Por ejemplo:

  1. uso del cepillo textura y una línea de sprites para crear un trazo de pintura negro en la textura Un
  2. cepillo puesto blanqueador + alfa en glColor4f y luego dibujar la textura A en la pantalla.

En el iPhone, hago esto continuamente mientras el dedo del usuario se mueve y puedo alcanzar 12-15 fps en un iPod Touch de 1ra generación. Es necesario porque aplicar color y alfa a los sprites individuales que componen la pincelada no produce el resultado correcto (ya que los sprites se superponen y hacen que la carrera sea demasiado oscura).

La plataforma android admite OpenGL ES 1.0 pero parece omitir funciones clave para tratar con framebuffers. No puedo encontrar una forma de enlazar una textura al framebuffer y dibujar dentro de ella usando OpenGL.

Así es como normalmente iría al respecto en el iPhone:

// generate a secondary framebuffer and bind it to OpenGL so we don't mess with existing output. 
glGenFramebuffers(1, &compositingFramebuffer); 
glBindFramebuffer(GL_FRAMEBUFFER, compositingFramebuffer); 

// attach a texture to the framebuffer. 
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0); 

// subsequent drawing operations are rendered into the texture 

// restore the primary framebuffer and (possibly) draw the rendered texture 
glBindFramebuffer(GL_FRAMEBUFFER, originalActiveFramebuffer); 

¿Hay algo como esto en la plataforma Android? En el iPhone, OpenGL es significativamente más rápido que el dibujo basado en software y es la única solución viable (créanme, también escribí una aplicación de pintura CoreGraphics ...). Tal vez hay otra ruta que podría tomar en Android? Estoy dispuesto a pasar por los aros que sean necesarios, pero no publicaré la aplicación a menos que el rendimiento sea (10 fps + mientras dibuja en la pantalla).

Respuesta

7

Soy escéptico de que todos los dispositivos Android sean compatibles con el mismo conjunto de extensiones de OpenGL ES, o que todos admitan la misma versión de OpenGL ES.

Los objetos Framebuffer (FBO) forman parte de la especificación de núcleo de OpenGL ES 2.0; si su dispositivo Android es compatible con ES 2.0, entonces es compatible con FBO.

Si su dispositivo Android compatible ES 1.1, a continuación, comprobar la cadena de extensión para GL_OES_framebuffer_object usando glGetString (GL_EXTENSIONS).

+3

Sólo para cualquier persona interesada, aquí están los GL_EXTENSIONS en algunos diversos dispositivos Android: http://www.rbgrn.net/content/345-hands-on-motorola-droid-opengl-es-specs Se parece que el DROID es el único teléfono Android compatible con framebuffers hasta el momento. –

Cuestiones relacionadas