SDL_image and OpenGL in 16 bits mode?

Started by
-1 comments, last by afont 15 years, 6 months ago
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