7
votes

Chargement d'un BMP dans une texture OpenGL interdit les couleurs rouge et bleue. (C ++ / Windows)

J'essaie de charger un bitmap dans une texture OpenGL et de l'afficher à l'écran, mais lorsque je le fais, les valeurs rouge et bleue semblent basculer (par exemple: une image bleue apparaît orange, les images vertes restent inchangées, etc..). Ce problème n'existe que lors du chargement de bitmaps, je peux charger une erreur relativement exempte d'erreur.

Ceci est le code que j'utilise pour charger les bitmaps et définir les textures. J'utilise le diable, mais je ne suis pas sûr de la pertinence de ce qui est, comme le problème existait lorsque j'ai utilisé un système différent (je ne me souviens pas bien de quoi, c'était une fonction dans la fenêtre.h, je crois): < / p> xxx

ilinit () et glenable (gl_texture_2d) sont tous deux appelés précédemment dans le programme, entre autres fonctions moins pertinentes. Toute aide pour trouver la cause de (et espérons que la fixation) du problème serait très appréciée.


0 commentaires

5 Réponses :


1
votes

J'ai eu un problème similaire au retour. Essayez de paramétrer GL_RBG dans GLTEXIMAGE2D à GL_BGG .


0 commentaires

0
votes

Vous avez normalement un appel à GLTEXIMAGE2D qui spécifie le format externe des pixels. A partir des sons des choses, vous devez vérifier cela et passer de GL_RGB à GL_BGR.


0 commentaires

10
votes

Vous avez votre RVB et votre BGR en arrière. xxx

existe un gl_bgr Vous pouvez spécifier sur la deuxième ligne, au lieu de gl_rgb ? Cela devrait le réparer.

La raison pour laquelle un PNG entraîne une retournement de l'image est dû à la manière dont un BMP est stocké: Les BMP sont stockés de bas en bas, les premiers pixels du fichier sont la rangée inférieure de l'image.


3 commentaires

Merci. J'ai essayé gl_bgr, mais je reçois une erreur disant que cela n'existe pas. Je ne vois pas non plus pourquoi un bitmap serait stocké avec des données BGR en premier lieu, n'est-ce pas?


@ KEAND64: Les fichiers BMP ou être précis sont en fait stockés dans la commande BGR. En fait, sur les systèmes modernes, les bitplanes de Frambuffer sont également en commande BGR (a), de sorte que la fourniture de textures au format BGR est généralement plus rapide que le format RVB. GL_BGR est un jeton de versions OpenGL> 1.1, mais la plate-forme Windows SDK est livrée uniquement avec des en-têtes pour OpenGL-1.1 - Tout ce qui est au-delà doit être accessible par des extensions. Il suffit de get glew glew.sourceforge.net ou glee, a utilisé les en-têtes de ceux-ci.


Vous pouvez aussi essayer "#include " mais peut-être avoir besoin d'obtenir une version récente de glext.h de opengl.org/registry/api/glext.h



2
votes

Vous pouvez basculer gl_rgb sur gl_bgr_ext . Dans certains cas, GL_BGGR n'est pas reconnu.


0 commentaires

0
votes

Je sais que c'est un ancien sujet, mais j'ai trouvé le moyen le plus simple consistait à retourner les Z et X dans la Vec4 que Texture2D retourne dans le shader de fragment, pas GLTexture2D. Il ne repose pas sur des extensions qui pourraient ne pas exister. Résolu sur un projet GLEES 2, je travaille sur.

                "varying vec2 v_texCoord;                         "
                "uniform sampler2d s_texture;                     "
                "vec4 v_bgr;                                      "
                "void main()                                      "
                "{                                                "
                "    v_bgr = texture2D( s_texture, v_texCoord );  "
                "  gl_FragColor = v_bgr.zyxw;                     "
                "}                                                ";


0 commentaires