SDL_image and OpenGL in 16 bits mode?
Hi group,
I’m trying to load an image stored in 32 bit color depth, in a 16 bits desktop (windows and linux), and load it to OpenGL, but I only get a white image.
I wanted to use the R5G5B5A1 format, to have transparency and keep high color quality, but I’m quite lost with all the formats and options.
I used the code found in this list to load a SDL_Surface and converting to a openGL texture, but it only appears to work in 32 bits, or in 16 bits without alpha (RGB565). The code down belows gives an GL_INVALID_ENUM.
Curiously, if I comment the SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 1), it doesn't give the error, but the image isn't rendered properly. I've tried a RGBA4, but it doesn't work either.
Any ideas about this??
Code:
Init Video:
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5);
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5);
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5);
SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 1);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
// create a new window
m_pScreen = SDL_SetVideoMode(Config.ResX, Config.ResY, 16, SDL_OPENGL);
Loading texture:
SDL_Surface* temp = IMG_Load(basefilename.c_str());
if (temp!=NULL)
{
SDL_Surface* temp2;
temp2 = SDL_DisplayFormatAlpha(temp);
m_tID = SDL_GL_LoadTexture(temp2, m_aTextureCoords);
SDL_FreeSurface(temp);
SDL_FreeSurface(temp2);
}
Converting SDL_Surface to texture:
GLuint COpenGLUtils::SDL_GL_LoadTexture(SDL_Surface *surface, GLfloat
*texcoord)
{
GLuint texture;
int w, h;
SDL_Surface *image;
SDL_Rect area;
Uint32 saved_flags;
Uint8 saved_alpha;
// Use the surface width and height expanded to powers of 2
w = power_of_two(surface->w);
h = power_of_two(surface->h);
texcoord[0] = 0.0f; // Min X
texcoord[1] = 0.0f; // Min Y
texcoord[2] = (GLfloat)surface->w / w; // Max X
texcoord[3] = (GLfloat)surface->h / h; // Max Y
image = SDL_CreateRGBSurface(
SDL_SWSURFACE,
w, h,
16,
#if SDL_BYTEORDER == SDL_LIL_ENDIAN // OpenGL RGBA masks
0x0000001F,
0x000003E0,
0x00007C00,
0x00008000
#else
0xFF000000,
0x00FF0000,
0x0000FF00,
0x000000FF
#endif
);
if ( image == NULL ) {
return 0;
}
// Save the alpha blending attributes
saved_flags = surface->flags;//&(SDL_SRCALPHA|SDL_RLEACCELOK);
saved_alpha = surface->format->alpha;
if ( (saved_flags & SDL_SRCALPHA) == SDL_SRCALPHA )
{
SDL_SetAlpha(surface, 0, 0);
}
// Copy the surface into the GL texture image
area.x = 0;
area.y = 0;
area.w = surface->w;
area.h = surface->h;
SDL_BlitSurface(surface, &area, image, &area);
// Restore the alpha blending attributes
if ( (saved_flags & SDL_SRCALPHA) == SDL_SRCALPHA )
{
SDL_SetAlpha(surface, saved_flags, saved_alpha);
}
//SetKeyColor(surface);
// Create an OpenGL texture for the image
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
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, GL_RGBA, w, h, 0, GL_RGBA,
GL_UNSIGNED_SHORT_5_5_5_1, image->pixels);
SDL_FreeSurface(image); /* No longer needed */
return texture;
}
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement