2011-02-23 1 views
1

En regardant les documents, je devrais être en mesure d'utiliser BGRA pour le format interne d'une texture. Je fournis la texture avec des données BGRA (en utilisant GL_RGBA8_OES pour glRenderbufferStorage car il semble que BGRA n'est pas autorisé). Cependant, ce qui suit ne fonctionne pas:BGRA sur iPhone glTexImage2D et glReadPixels

glTexImage2D(GL_TEXTURE_2D, 0, **GL_BGRA**, w, h, 0, GL_BGRA, GL_UNSIGNED_BYTE, buffer); 
... 
glReadPixels(0, 0, w,h, GL_BGRA, GL_UNSIGNED_BYTE,buffer, 0); 

Bien que cela me donne un cadre noir:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_BGRA, GL_UNSIGNED_BYTE, buffer); 
... 
glReadPixels(0, 0, w,h, **GL_BGRA**, GL_UNSIGNED_BYTE,buffer, 0); 

Et cela fonctionne, mais les bleus/rouges sont inversées (je fournir des données BGRA à la texture):

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,w, h, 0, GL_BGRA, GL_UNSIGNED_BYTE, buffer); 
... 
glReadPixels(0, 0, w,h, **GL_RGBA**, GL_UNSIGNED_BYTE,buffer, 0); 

... pourquoi ne puis-je pas simplement utiliser BGRA? Je remarque que glRenderbufferStorage ne semble pas accepter les formats BGRA ... Je suis vraiment confus. BGRA est le seul format approprié pour mes données, car il provient de l'appareil photo de l'iPhone.

Répondre

5

Le troisième paramètre à glTexImage2D() est le nombre de composants de couleur dans la texture, pas l'ordre de pixels de la texture. Vous voulez utiliser GL_RGBA ici, ou ça ne marchera pas.

Je ne crois pas GL_BGRA est pris en charge par glReadPixels() sur les appareils iOS en tant que format de couleur. Bien que Apple fournisse des données de pixel aux textures au format BGRA lors du traitement des images vidéo, je pense que vous pouvez le lire au format RGBA, puis l'encoder sur disque, comme vous l'avez décrit ailleurs. Si vous voulez voir un exemple de projet qui prend des images vidéo de caméra dans BGRA, les envoie à une texture, les traite en utilisant des shaders, puis lit les pixels résultants, vous pouvez vérifier celui que j'ai construit here.

+0

Merci. Et c'est ce que j'ai fait. Le problème était que lorsque l'écran était bloqué, il était inversé. J'ai juste fait le swizzling dans le shader final pour l'affichage et cela a fonctionné. Je voulais juste éviter les passages supplémentaires, car mon taux de trame souffre déjà :) – akaru

0

Ma propre recherche d'OpenGL ES2 indique que cela fonctionne pour le format natif little endian BGRA sous iOS. Ici "pixels" pointe vers un tampon de BGRA 32 bits qui proviendrait d'un CGBitmapContextCreate() ou saisissant les données d'image à partir d'un CGImageRef.

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, pixels); 

Voir le poste Apple pour ce here. Bonne discussion de ce numéro here