1

DevIL で画像を読み込もうとして、OpenGL でテクスチャを作成しようとすると、問題が発生します。私の友人が彼の Windows で私のプログラムをテストしたとき、テクスチャを含むはずの四角形はすべて白く、画像 (テクスチャ) はありませんでした。この問題は、Windows XP、Windows Vista、および Windows 7 でのみ発生するようですが、すべての Windows PC で発生するわけではありません。私の Windows XP では問題なくプログラムが実行されます。

いくつかの DLL やファイルが見つからない (ありそうもない) か、画像をロードしたり、テクスチャとして使用したりできない何かが存在する可能性があります。一方、プログラムは *UNIX システム上で問題なく動作します。

これは、画像を読み込んでテクスチャを生成するために使用しているコードです。

void Image::load(const char* filename)
{
    ILuint ilimg;

    ilGenImages(1, &ilimg);
    ilBindImage(ilimg);

    if (!ilLoadImage(filename))
        throw ImageLoadError;

    glGenTextures(1, &image);
    glBindTexture(GL_TEXTURE_2D, image);

    bpp = ilGetInteger(IL_IMAGE_BPP);
    width = ilGetInteger(IL_IMAGE_WIDTH);
    height = ilGetInteger(IL_IMAGE_HEIGHT);
    format = ilGetInteger(IL_IMAGE_FORMAT);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

    glTexImage2D(GL_TEXTURE_2D, 0, bpp, width, height, 0, format,
        GL_UNSIGNED_BYTE, ilGetData());

    ilDeleteImages(1, &ilimg);
}

これは、テクスチャが適用された四角形を描画するコードです。

void Rect::show()
{
    glPushAttrib(GL_CURRENT_BIT);

    glEnable(GL_TEXTURE_2D);
    glColor4f(1.0, 1.0, 1.0, opacity);
    glBindTexture(GL_TEXTURE_2D, texture->get_image());

    glBegin(GL_POLYGON);
        glTexCoord2i(0, 0); glVertex2f(x, y);
        glTexCoord2i(1, 0); glVertex2f(x+width, y);
        glTexCoord2i(1, 1); glVertex2f(x+width, y+height);
        glTexCoord2i(0, 1); glVertex2f(x, y+height);
    glEnd();

    glDisable(GL_TEXTURE_2D);

    glPopAttrib();
}

私が言及していない他のコードが必要な場合は、私に尋ねてください。投稿します。

4

2 に答える 2

0
glTexImage2D(target, level, internal format, width, height, border, format, type, data);

glTexImageの内部フォーマットパラメータは、ピクセルあたりのビット数ではありません。実際には、その数値は形式とはまったく関係ありません。OpenGL では、特定の値のみが有効であると定義されています。その中には、数値関係を持つ 4 つもありますが、ニーモニックとして、1 (GL_LUMINANCE の短縮形)、2 (GL_LUMINANCE_ALPHA)、3 (GL_RGB)、4 (GL_RGBA) が定義されています。他にも多くの形式トークンがありますが、それらの数値は任意に選択されます。

また、画像データの bpp を使用して、形式のパラメーターを検索します。そのためには、LUT またはスイッチケース構造を実装する必要があります。

于 2010-12-21T01:01:13.263 に答える
-1

発生している問題は、実装バージョンの問題のようです。おそらく「正しい」が「あまり良くない」実装では、微妙に間違っていることを回避できません。または、実装に微妙なバグがあり、有効なコードを受け入れていない可能性があります。

交換してみるかな

glColor4f(1.0, 1.0, 1.0, opacity);
glBindTexture(GL_TEXTURE_2D, texture->get_image());

glBindTexture(GL_TEXTURE_2D, texture->get_image());
glColor4f(1.0, 1.0, 1.0, opacity);

texcoord の前に頂点を宣言します。

glVertex2f(x, y);
glTexCoord2i(0, 0);

「The Red Book」をまだ持っていない場合は、 http: //glprogramming.com/red/chapter09.htmlを参照してください。

于 2010-12-21T00:20:31.490 に答える