Почему изображения, загруженные в текстуру с помощью IMG_Load в SDL и OpenGL, выглядят голубоватыми?

Я загружаю текстуру PNG с помощью:

void Sprite::setTexture(string f) {
    SDL_Surface *image = IMG_Load(f.c_str());
    if (image == NULL) {
        this->texture = -1;
        return;
    }
    SDL_DisplayFormatAlpha(image);
    unsigned object(0);
    glGenTextures(1, &object);
    glBindTexture(GL_TEXTURE_2D, object);
    glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
    glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image->w, image->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, image->pixels);
    SDL_FreeSurface(image);
    this->texture = object;
}

Единственная проблема в том, что вместо этого (видно в Photoshop):

Исходная коробка

это показано так (видно в приложении):

Что случилось? Я пробовал немного поиграть с GL_RGBA и пытался инвертировать его в GL_BGRA или изменить на GL_RGBA8, GL_RGBA16... но ничего не изменилось (на самом деле GL_BGRA ничего не показал). Мне нужен альфа-канал, даже в этом маленьком PNG границы имеют радиус 4 пикселя, поэтому углы изображения прозрачны.

Что я делаю неправильно? Ящик приложений


person Shoe    schedule 02.12.2012    source источник


Ответы (1)


Похоже, ваши каналы перевернуты. Отсюда трудно понять, правильно ли работает ваша альфа-версия, но некоторые текстуры ARGB, возможно, вам стоит попробовать это!

На самом деле, просто для проверки ваших данных, вы должны проверить свой

SDL_Surface *image

И посмотрите, что такое image->format->Rmask Gmask Bmask и Amask, таким образом, вы можете быть уверены, какой формат имеет ваша поверхность.

person emartel    schedule 02.12.2012
comment
На самом деле я повторил попытку glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image->w, image->h, 0, GL_BGRA, GL_UNSIGNED_BYTE, image->pixels);, и это сработало. Вероятно, в прошлый раз я установил другой внутренний формат. Спасибо. - person Shoe; 02.12.2012
comment
@Jeffrey Джеффри, я не уверен, означает ли ваш комментарий, что вы узнали, как преобразовать свою поверхность или нет? - person emartel; 02.12.2012