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.
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_RGB5_A1, w, h, 0, GL_RGB5_A1,
GL_UNSIGNED_BYTE, image->pixels);
???
??? SDL_FreeSurface(image); /* No longer needed */
??? return texture;
}