2011-02-25 16 views
7

ビットマップをOpenGLテクスチャに読み込んで画面に表示しようとしていますが、そうすると赤と青の値が切り替わるように見えます(例:青いイメージはオレンジ色、緑色画像は変わらない、等)。この問題は、ビットマップを読み込むときにのみ発生し、.pngを比較的エラーフリーで読み込むことができます。OpenGLテクスチャにBMPを読み込むと、赤と青の色が切り替わります。 (C++/Windows)

これはビットマップを読み込んでテクスチャを設定するコードです。私はDevIlを使用していますが、私は別のシステムを使用したときに問題が存在していたので、どのように関連性があるのか​​よく分かりません(私はかなり覚えていません。window.hの関数です)。

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()glEnable(GL_TEXTURE_2D)の両方が、プログラムの中で、より関連性の低い機能の中で、より早く呼び出されます。問題の原因を見つけ出すのに役立つ(そしてうまくいけば)問題を解決することは大いに感謝しています。

答えて

10

あなたはRGBとBGRを後方に持っています。

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

かわりGL_RGBの2行目に指定することができますGL_BGRはありますか?それはそれを修正する必要があります。

BMPがどのように格納されるかによって、PNGがイメージを反転させる理由は、BMPがボトムアップに格納されているため、ファイルの最初のピクセルがイメージの最下行になります。

+0

ありがとうございました。 GL_BGRを試しましたが、存在しないというエラーが表示されます。私はまた、ビットマップがBGRデータと共に最初に格納される理由を見ませんか? –

+1

@ Keand64:BMPファイル、または正確には実際にはBGRの順序で格納されています。実際に現代のシステムでも、フレームバッファのビットプレーンはBGR(A)の順番になっているため、BGR形式のテクスチャの供給は通常RGB形式より高速です。 GL_BGRはOpenGLバージョン1.1以上のトークンですが、WindowsプラットフォームSDKにはOpenGL-1.1のヘッダーのみが付属しています。拡張機能を介してアクセスする必要があります。ちょうどGLEW http://glew.sourceforge.netまたはGLeeを入手し、それらからヘッダを使用してください。 – datenwolf

+1

また、 "#012lu"を試してみることもできますが、http://www.opengl.org/registry/api/glext.hからglext.hの最新バージョンを取得する必要があります。 – Alink

1

私は同じような問題を抱えていました。 glTexImage2DGL_BGRGL_RBGを設定してみてください。

0

通常、ピクセルの外部形式を指定するglTexImage2Dが呼び出されます。物事の音から、それをチェックし、GL_RGBからGL_BGRに切り替える必要があります。

2

GL_RGBGL_BGR_EXTに切り替えることができます。 GL_BGRが認識されない場合があります。

+2

正確に私のケース。 –

0

これは古いトピックですが、glTexture2dではなく、フラグメントシェーダーでtexture2Dが返すvec4のzとxを反転するのが最も簡単な方法でした。存在しない拡張機能には依存しません。作業中のGLES 2プロジェクトで解決しました。

   "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;      " 
       "}            "; 
関連する問題