2011-02-25 28 views
7

Estoy tratando de cargar un mapa de bits en una textura OpenGL y mostrarlo en la pantalla, pero cuando lo hago, los valores rojo y azul parecen cambiar (por ejemplo, una imagen azul aparece naranja, verde las imágenes permanecen sin cambios, etc.). Este problema solo existe al cargar bitmaps, puedo cargar .pngs relativamente libre de errores.Cargando un BMP en una texturas OpenGL cambia los colores rojo y azul. (C++/Windows)

Este es el código que estoy usando para cargar los mapas de bits y establecer las texturas. Estoy usando DevIl, pero no estoy seguro de cuán relevante es, ya que el problema existía cuando usaba un sistema diferente (no recuerdo exactamente qué, era una función en window.h, creo):

ilOriginFunc(IL_ORIGIN_LOWER_LEFT); 
ilEnable(IL_ORIGIN_SET); 
ILuint image; 
ilGenImages(1, &image); 
ilBindImage(image); 
ilLoad(IL_BMP, "Data/NeHe.bmp"); // Incidentally, loading a png, although it fixes the problem, 
           // rotates the image 180 degrees. Not sure if that's important or not, 
           // But it's why I added the first line of code 

glGenTextures(3, &_texture[0]); 
glBindTexture(GL_TEXTURE_2D, _texture[0]); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexImage2D(GL_TEXTURE_2D, 0, 3, ilGetInteger(IL_IMAGE_WIDTH), ilGetInteger(IL_IMAGE_HEIGHT), \ 
    0, GL_RGB, GL_UNSIGNED_BYTE, ilGetData()); 

ilInit() y glEnable(GL_TEXTURE_2D) sean llamados anteriormente en el programa, entre otras funciones menos relevantes. Cualquier ayuda para encontrar la causa de (y con suerte solucionar) el problema sería muy apreciada.

Respuesta

10

Tienes tu RGB y BGR al revés.

glTexImage2D(GL_TEXTURE_2D, 0, 3, ilGetInteger(IL_IMAGE_WIDTH), ilGetInteger(IL_IMAGE_HEIGHT), \ 
    0, GL_RGB, GL_UNSIGNED_BYTE, ilGetData()); 

¿Existe un GL_BGR se puede especificar en la segunda línea, en lugar de GL_RGB? Eso debería arreglarlo.

El motivo por el cual un PNG hace que la imagen se voltee es por la forma en que se almacena un BMP: los BMP se almacenan de abajo hacia arriba, los primeros píxeles del archivo son la fila inferior de la imagen.

+0

Gracias. Intenté GL_BGR, pero recibo un error que dice que no existe. Tampoco entiendo por qué un mapa de bits se almacena con datos BGR en primer lugar, ¿verdad? –

+1

@ Keand64: los archivos BMP, o para ser precisos, de hecho están almacenados en orden BGR. De hecho, en los sistemas modernos, también los bitplanes frambuffer están en orden BGR (A), por lo que el suministro de texturas en formato BGR suele ser más rápido que el formato RGB. GL_BGR es un token de las versiones de OpenGL> 1.1, sin embargo, el SDK de la plataforma de Windows se envía solo con encabezados para OpenGL-1.1. Se debe acceder a cualquier elemento más allá a través de las extensiones. Simplemente obtenga GLEW http://glew.sourceforge.net o GLee, use los encabezados de los que ya se han hecho. – datenwolf

+1

También puede intentar "#include ", pero tal vez necesite obtener una versión reciente de glext.h desde http://www.opengl.org/registry/api/glext.h – Alink

1

Tuve un problema similar hace un tiempo. Intente configurar GL_RBG en glTexImage2D en GL_BGR.

0

Normalmente tendrá una llamada a glTexImage2D que especifica el formato externo de los píxeles. Por los sonidos de las cosas, necesita verificar eso y cambiar de GL_RGB a GL_BGR.

2

Puede cambiar GL_RGB a GL_BGR_EXT. En algunos casos, GL_BGR no se reconoce.

+2

Precisamente mi caso. –

0

Sé que este es un tema antiguo pero encontré que la manera más fácil era voltear z y x en el vec4 que texture2D devuelve en el sombreador de fragmentos, no glTexture2d. No se basa en extensiones que pueden no existir. Lo resolví en un proyecto de GLES 2 en el que estoy trabajando.

   "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;      " 
       "}            "; 
Cuestiones relacionadas