Question

J'écris une application pour Mac OS> = 10.6 qui crée des textures OpenGL à partir d'images chargées à partir du disque.

Tout d'abord, je charge l'image dans un nsimage. Ensuite, je reçois le nsbitmapimagerep à partir de l'image et je charge les données de pixels dans une texture à l'aide de Gltexage2d.

Pour les images RVB ou RGBA, cela fonctionne parfaitement. Je peux passer en 3 octets / pixels de RGB, soit 4 octets de RGBA, et créer une texture RGBA de 4 octets / pixels.

Cependant, je viens de voir un testeur m'envoyer une image JPEG (tournée sur un Canon EOS 50D, je ne sais pas comment il a été importé) qui semble avoir une commande d'octet Argb.

J'ai trouvé un article sur ce fil: (http://www.cocoabuilder.com/archive/cocoa/12782-coregraphics-over-opengl.html) qui suggère que je spécifie un paramètre de format de GL_BGRA à GLTEXIMAGE2D, et un type d'un type de paramètre de format de GL_BGRA à GLTEXIMAGE2D, et un type de type de paramètre de format de GL_BGRA à GLTEXIMAGE2D, et un type de type de paramètre de format de GL_BGRA à GLTEXIMAGE2D, et un type de type de paramètre de format de GL_BGRA à GLTEXIMAGE2D, et un type de type de paramètre de format de GL_BGRA à GLTEXX GL_UNSIGNED_INT_8_8_8_8_REV.

Cela semble logique, et il semble que cela devrait fonctionner, mais ce n'est pas le cas. Je reçois des valeurs de couleurs différentes, mais toujours mauvaises.

J'ai écrit du code "Swizzling" (manuel d'échange d'octets) qui mélange les données d'image Argb dans un nouveau tampon RGBA, mais cet swizzling d'octets par octets va être lent pour les grandes images.

Je voudrais également comprendre comment faire fonctionner "la bonne façon".

Quelle est l'astuce pour charger les données Argb dans une texture RGBA OpenGL?

Mon appel actuel à xxx ressemble à ceci:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, newWidth, newHeight, 0, format, GL_UNSIGNED_BYTE, pixelBuffer);

où est RVB ou RGBA.

J'ai essayé d'utiliser:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, newWidth, newHeight, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, pixelBuffer);

Lorsque mon représentant d'image rapporte qu'il est dans l'ordre "Alpha First".

En tant que deuxième question, j'ai également lu que la plupart du format "natif" de la carte graphique est GL_BGRA, donc la création d'une texture dans ce format se traduit par un dessin de texture plus rapide. La vitesse du dessin de la texture est plus importante que la vitesse de chargement de la texture, donc "swizzling" les données au format BGRA à l'avance en valait la peine. J'ai essayé de demander à OpenGL de créer une texture BGRA en spécifiant un "Internalformat" de GL_RGBA, mais cela se traduit par une image complètement noire. Mon interprétation sur les documents me fait m'attendre à ce que Gltexage2d échoue les données tel qu'il le lit si les formats source et interne sont différents, mais à la place, j'obtiens une erreur OpenGL 0x500 (GL_INVALID_ENUM) lorsque j'essaie de spécifier un "InternalFormat" de GL_RGBA. Qu'est-ce que je rate?

Pas de solution correcte

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top