问题
I'm loading a PNG texture with:
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;
}
The only problem is that instead of being like this (seen in Photoshop):
it is shown like this (seen in the app):
What's wrong? I have tried playing a little bit with tha GL_RGBA and tried to invert it to GL_BGRA or change it to GL_RGBA8, GL_RGBA16... but nothing changed (actually GL_BGRA didn't show anything). I need the alpha channel, even in this little PNG the borders are radius at 4px and so the image angles are transparent.
What am I doing wrong?
回答1:
It definitely looks like your channels are inverted. It's hard to see from here if your alpha is working properly, but some textures are ARGB
, maybe you should try that!
Actually, just to validate your data, you should check your
SDL_Surface *image
And see what's image->format->Rmask
Gmask
Bmask
and Amask
, this way you can be sure what format your surface has.
来源:https://stackoverflow.com/questions/13666196/why-do-images-loaded-to-texture-with-img-load-in-sdl-and-opengl-look-bluish