2009-11-11 3 views
6

J'écris des applications graphiques pour l'iPhone et je cherche à porter mon application la plus récente, 'Layers', sur la plateforme Android. Layers est une application de peinture qui permet aux utilisateurs de dessiner sur l'écran et de créer des peintures multicouches avec différents pinceaux, couleurs, etc ... et exporter vers PSD. Il a synchronisé le bureau, un outil de bavure, beaucoup de bonnes choses ... http://www.layersforiphone.com/Android OpenGLES Render-to-Texture

J'ai commencé à regarder la plate-forme Android lundi et j'ai rencontré un problème majeur. J'utilise OpenGL pour faire tout le dessin car il offre les meilleures performances. Cependant, il y a plusieurs endroits où je dois rendre dans une texture et ensuite utiliser la texture. Par exemple:

  1. Utilisation texture de la brosse et une ligne de sprites pour créer un trait de peinture noire dans la texture A
  2. Put brosse couleur + alpha dans glColor4f puis tirer texture A sur l'écran.

Sur l'iPhone, je le fais continuellement comme le doigt de l'utilisateur se déplace et je suis en mesure d'atteindre 12-15fps sur un iPod touch de 1ère génération. Cela est nécessaire car l'application de la couleur et de l'alpha aux sprites individuels constituant le coup de pinceau ne produit pas le bon résultat (puisque les sprites se chevauchent et rendent le trait trop sombre).

La plate-forme Android prend en charge OpenGL ES 1.0 mais semble ignorer les fonctions clés pour traiter les framebuffers. Je ne peux pas trouver un moyen de lier une texture au framebuffer et dessiner dedans en utilisant OpenGL.

Voilà comment je normalement aller à ce sujet sur l'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); 

Y at-il quelque chose comme ça sur la plate-forme Android? Sur l'iPhone, OpenGL est nettement plus rapide que le dessin logiciel et est la seule solution viable (croyez-moi - j'ai aussi écrit une application de peinture CoreGraphics ...). Peut-être qu'il y a une autre voie que je pourrais prendre sur Android? Je suis prêt à sauter à travers tout ce qui est nécessaire, mais je ne publierai pas l'application à moins que la performance est bon (10fps + que vous dessinez sur l'écran).

Répondre

7

Je suis sceptique que tous les appareils Android supporteraient exactement le même ensemble d'extensions OpenGL ES, ou qu'ils supporteraient tous exactement la même version d'OpenGL ES.

Les objets Framebuffer (FBO) font partie de la spécification de base OpenGL ES 2.0; Si votre appareil Android prend en charge ES 2.0, il prend en charge les FBO.

Si votre appareil Android prend en charge ES 1.1, vérifiez la chaîne d'extension pour GL_OES_framebuffer_object utilisant glGetString (GL_EXTENSIONS).

+3

Juste pour toute personne intéressée, voici les GL_EXTENSIONS sur quelques différents appareils Android: http://www.rbgrn.net/content/345-hands-on-motorola-droid-opengl-es-specs Il On dirait que le DROID est le seul téléphone Android à supporter les framebuffers jusqu'à présent. –

Questions connexes