Я загружаю текстуру 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 пикселя, поэтому углы изображения прозрачны.
Что я делаю неправильно?
Похоже, что ваши каналы инвертированы. Отсюда трудно увидеть, правильно ли работает ваша альфа, но некоторые текстуры ARGB
, может быть, вы должны попробовать это!
На самом деле, просто для проверки ваших данных, вы должны проверить ваши
SDL_Surface *image
И посмотри что image->format->Rmask
Gmask
Bmask
а также Amask
Таким образом, вы можете быть уверены, что формат вашей поверхности.
Других решений пока нет …