Jump to content
  • Advertisement
Sign in to follow this  

OpenGL SDL_image and OpenGL in 16 bits mode?

This topic is 3564 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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; }

Share this post

Link to post
Share on other sites
Sign in to follow this  

  • Advertisement

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!