2011-02-25 12 views
7

Sto provando a caricare una bitmap in una trama OpenGL e visualizzarla sullo schermo, ma quando lo faccio, i valori rosso e blu sembrano cambiare (ad esempio: un'immagine blu appare arancione, verde le immagini rimangono invariate, ecc.). Questo problema esiste solo quando si caricano bitmap, posso caricare .pngs relativamente senza errori.Il caricamento di un BMP in trame OpenGL cambia i colori rosso e blu. (C++/Windows)

Questo è il codice che sto utilizzando per caricare le bitmap e impostare le trame. Sto usando DevIl, ma non sono sicuro di quanto sia rilevante, poiché il problema esisteva quando ho usato un sistema diverso (non ricordo bene cosa, era una funzione in window.h, credo):

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() e glEnable(GL_TEXTURE_2D) sono entrambi chiamati in precedenza nel programma, tra le altre funzioni meno importanti. Qualsiasi aiuto nel trovare la causa (e si spera che risolva) il problema sarebbe molto apprezzato.

risposta

10

Hai il tuo RGB e BGR all'indietro.

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

C'è un GL_BGR è possibile specificare sulla seconda riga, invece di GL_RGB? Questo dovrebbe risolverlo.

Il motivo per cui un PNG provoca il capovolgimento dell'immagine è dovuto al modo in cui è memorizzato un BMP: i file BMP sono memorizzati in basso, i primi pixel nel file sono la riga inferiore dell'immagine.

+0

Grazie. Ho provato GL_BGR, ma ottengo un errore dicendo che non esiste. Inoltre, non vedo perché una bitmap verrebbe memorizzata con i dati BGR in primo luogo, vero? –

+1

@ Keand64: i file BMP, o per la precisione, sono infatti memorizzati nell'ordine BGR. In realtà su sistemi moderni anche i bitmap del frambuffer sono in ordine BGR (A), quindi la fornitura di trame in formato BGR di solito è più veloce del formato RGB. GL_BGR è un token dalle versioni OpenGL> 1.1, tuttavia Windows Platform SDK viene fornito solo con le intestazioni per OpenGL-1.1 - è necessario accedere a qualsiasi altra via attraverso le estensioni. Scarica GLEW http://glew.sourceforge.net o GLee, usa le intestazioni da quelle che si possono fare con esso. – datenwolf

+1

Puoi anche provare "#include " ma forse hai bisogno di ottenere una versione recente di glext.h da http://www.opengl.org/registry/api/glext.h – Alink

1

Ho avuto un problema simile qualche tempo fa. Prova a impostare GL_RBG in glTexImage2D a GL_BGR.

0

Generalmente si ha una chiamata a glTexImage2D che specifica il formato esterno dei pixel. Dai suoni delle cose, è necessario verificarlo e passare da GL_RGB a GL_BGR.

2

È possibile passare da GL_RGB a GL_BGR_EXT. In alcuni casi, GL_BGR non viene riconosciuto.

+2

Precisamente il mio caso. –

0

So che questo è un vecchio argomento ma ho trovato che il modo più semplice era di capovolgere z e x nel vec4 che texture2D restituisce nello shader del frammento, non glTexture2d. Non si basa su estensioni che potrebbero non esistere. Risolto il problema su un progetto GLES 2 su cui sto lavorando.

   "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;      " 
       "}            "; 
Problemi correlati