Почему изображения, загруженные в текстуру с 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 пикселя, поэтому углы изображения прозрачны.

Что я делаю неправильно?
Коробка приложения

3

Решение

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

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

SDL_Surface *image

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

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]