Белые текстуры с OpenGL и DevIL в некоторых системах Windows - PullRequest
1 голос
/ 21 декабря 2010

У меня возникают некоторые проблемы при попытке загрузить изображения с помощью DevIL и при создании текстур в OpenGL.Когда мой друг тестировал мою программу на своей Windows, все элементы, которые должны были содержать текстуры, были белыми, без какого-либо изображения (текстуры).Кажется, проблема возникает только в Windows XP, Windows Vista и Windows 7, но не на каждом ПК с Windows: моя 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();
}

Если вам нужен какой-то другой код, который я не упомянул, спросите меня, и я опубликую его.

Ответы [ 2 ]

0 голосов
/ 21 декабря 2010
glTexImage2D(target, level, internal format, width, height, border, format, type, data);

Параметр внутреннего формата *1003* для glTexImage не является битом на пиксель.На самом деле его числовое значение вообще не связано с форматом.OpenGL определяет только определенные значения, чтобы быть действительными, среди них также четыре с числовым отношением, но просто как мнемоника: 1 (сокращение для GL_LUMINANCE), 2 (GL_LUMINANCE_ALPHA), 3 (GL_RGB), 4 (GL_RGBA).Существует также ряд токенов других форматов, но их числовое значение выбирается произвольно.

Кроме того, bpp для данных изображения используется для поиска параметров формата и типа .Для этого вам потребуется реализовать LUT или структуру переключения.

0 голосов
/ 21 декабря 2010

Проблема, с которой вы столкнулись, звучит как проблема версии реализации.Вероятно, «правильная», но менее «приятная» реализация не дает вам уйти с чем-то слегка некорректным.Или, с другой стороны, реализация может иметь незначительную ошибку и не принимает ваш действительный код.

Я мог бы попытаться обменять

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);

Если не считать "Красную книгу", проконсультируйтесь http://glprogramming.com/red/chapter09.html

...