3

OpenGL 環境で CImg を使用しています。テクスチャを追加しようとすると、各色がテクスチャ内の個別のタイルに分かれているように見えます。たとえば、次のようなテクスチャを使用しようとすると:

私のプログラムでは次のようになります。

読み込んでいるテクスチャは 512x512 の .bmp ファイルで、24 ビットの色深度、RBG で Gimp に保存されています。Gimp で許可されている他の形式をいくつか試してみましたが、CImg でエラーが発生するだけです。

これは私がテクスチャをロードする方法です:

glBindTexture(GL_TEXTURE_2D, 13);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);

CImg<unsigned char> src("MilkyWay.bmp");
glTexImage2D (GL_TEXTURE_2D, 0, GL_RGB, src.width(), src.height(), 
    0, GL_RGB, GL_UNSIGNED_BYTE, src);

これがテクスチャを表示する方法です。

glEnable (GL_TEXTURE_2D);
glBindTexture (GL_TEXTURE_2D, 13);
glBegin (GL_QUADS);         
    glTexCoord2f (0.0, 1.0);
    glVertex3f (-120.0, 120.0, 0.0);
    glTexCoord2f (1.0, 1.0);
    glVertex3f (120.0, 120.0, 0.0);
    glTexCoord2f (1.0, 0.0);
    glVertex3f (120.0, -120.0, 0.0);
    glTexCoord2f (0.0, 0.0);
    glVertex3f (-120.0, -120.0, 0.0);
glEnd ();
4

2 に答える 2

1

CImg はチャネルを非インターリーブ (または「平面」) で格納しますが、GL はその逆を想定しています。結果はあなたが見るものです。

データを再配置する (または CImg に任せる) こともできますが、チャネルもソース形式でインターリーブされる傾向があるため、イメージ ライブラリにインターリーブを解除させて、中間ステップでのみ再インターリーブさせてから、 GLは非効率的です。代わりに、画像データを直接使用できるように、別の方法で画像データを読み込むことをお勧めします。

これを行うライブラリは多数ありますが、BMP は直接読み取るのが非常に簡単な形式です。

于 2013-07-05T12:23:13.760 に答える