png's as textures

Started by
4 comments, last by traiger 18 years, 10 months ago
Does anyone here use png's as textures as I am having problems. I can load the image via SDL and even apply it as a texture provided that the alpha channel is not used. So does any anyone use png's as textures where transparency is used? Thanks Paul
Advertisement
What exactly is the problem, does the texture turn into some funky hippie pattern, does the whole program crash and burn, or is it just not transparent.

Normaly it shouldn't be a problem, even with png files, you probobly just have to tell openGL that it is a transparent texture, you allso need to make shure you have to correct blending.
I'm using them with SDL + SDL_Image + OpenGL, and currently have no problems with them :-) even with those that are partially transparent.

Here's function that I use to load textures:

bool SC :: TextureMgr :: LoadTexture(const TexturesItor & _itor, const char * _directory, const char * _textureName) {  string filename(_directory);  filename += _textureName;      TextureGroupItor textureItor = _itor->second->find(_textureName);       if (textureItor != _itor->second->end())   {    ++(textureItor->second.refCount);            #ifdef __SC_LOG_TEXTURE_REUSE__     log2("Reusing", filename);    #endif    return true;   }          #ifdef __SC_LOG_TEXTURE_NEW__   log2("New", filename)  #endif    if (!fileExists(filename.c_str())) return false;// -------------------------------------------------   SDL_Surface * tmp = IMG_Load(filename.c_str());     if (tmp == 0) return false;    // first check whether it is needed to expand texture size to powers of 2    usint w = tmp->w;    usint h = tmp->h;  usint physicalW = tmp->w;  usint physicalH = tmp->h;    SDL_Surface * image = tmp; // create alias    bool IsWidth = IsPowerOfTwo(w);  bool IsHeight = IsPowerOfTwo(h);   // -------------------------------------------------        if ((!IsWidth) || (!IsHeight) || (tmp->format->BitsPerPixel != 32))   {    #ifdef __SC_LOG_TEXTURE_STARTUP__      if ((!IsWidth) || (!IsHeight)) debug("This texture needs to be resized during startup.")      if (tmp->format->BitsPerPixel != 32) debug("This texture needs to have altered color depth.")      debug("In release versions, please remember to fix it so startups will be much shorter.")    #endif          if (!IsWidth) w = PowerOfTwo(w);    if (!IsHeight) h = PowerOfTwo(h);// -------------------------------------------------	   Uint32 rmask, gmask, bmask, amask;    /*	 SDL interprets each pixel as a 32-bit number, so our masks must depend on the endianness	 (byte order) of the machine	*/    #if SDL_BYTEORDER == SDL_BIG_ENDIAN      rmask = 0xff000000;      gmask = 0x00ff0000;      bmask = 0x0000ff00;      amask = 0x000000ff;    #else      rmask = 0x000000ff;      gmask = 0x0000ff00;      bmask = 0x00ff0000;      amask = 0xff000000;    #endif// -------------------------------------------------	// now image is no longer alias to tmp, rather that new surface	image = SDL_CreateRGBSurface(SDL_SWSURFACE /*| SDL_SRCALPHA*/, w, h, 32, rmask, gmask, bmask, amask);		if ( image == 0 ) 	 {      logError2("TextureMgr", "Couldn't allocate memory for expanding texture to power of 2")      SDL_FreeSurface(tmp);	  SC_ASSERT(!"Couldn't allocate memory for expanding texture to power of 2")	  return false;	 }      SDL_Rect area;    area.x = 0;    area.y = 0;    area.w = tmp->w;    area.h = tmp->h;      // it was fucking stupid bug with 32 bpp textures that needed to be resized	if ( tmp->format->BitsPerPixel == 32)        SDL_SetAlpha(tmp, 0, 0);	// copy the tmp into the new GL texture image	SDL_BlitSurface(tmp, &area, image, &area);		SDL_FreeSurface(tmp);	tmp = 0;   }// -------------------------------------------------       TextureHandle textureHwnd;     glGenTextures(1, &textureHwnd.id);    glBindTexture(GL_TEXTURE_2D, textureHwnd.id);            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);           glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, image->pixels);       textureHwnd.width = w;  textureHwnd.height = h;  textureHwnd.physicalWidth = physicalW;  textureHwnd.physicalHeight = physicalH;  textureHwnd.refCount = 1;    if (tmp) SDL_FreeSurface(tmp);   else SDL_FreeSurface(image);    // now add it to map 					     (_itor->second)->insert(TextureGroupPair(_textureName, textureHwnd));  return true; }


Also, check your rendering code - ie. are you enabling transparency (glEnable(GL_BLEND))?


HTH
You also want to make sure you pass the right pixel format to glTexImage2d
Thanks for your comments I'll look into them all later.

The specific problem is those pngs with partial transparency do not show at all.
nm

I got it to work using the alpha code from here.

http://www.devolution.com/pipermail/sdl/2005-February/067479.html

thanks for everyones advice.

Paul

This topic is closed to new replies.

Advertisement