SDL openGL PNG transparency?

Started by
10 comments, last by saschaheylik 12 years ago

You're creating an RGB texture, so the texture doesn't even have an alpha channel. Check the third parameter to glTexImage; you're telling OpenGL that you only want three color components, the R, the G and the B channels, and to throw away the alpha channel. Pass GL_RGBA instead to make it an RGBA texture.

But on another note; don't create the texture all the time you draw like that. Create it once when you start the program, and then just save the texture ID and bind it every frame instead.


Oh my god...you, my good, sir, are brilliant! It works!!

JoeBRILLIANCE.png

It's so beautiful!

You have also saved me *another* great deal of trouble and time, because I knew the way I was adding graphics was lagging immensely, but didn't know why.

I cannot thank you enough Brother Bob!

I guess I should have read the parameters more carefully when implementing the functions.
Advertisement
Hi,

found this through google since I had the same problem. Here's the stand-alone solution for those who are still looking for it.

#include <SDL/SDL.h>
#include <SDL/SDL_opengl.h>
GLuint SDLOAT::Graphics::surfaceToTexture(SDL_Surface* surface)
{
GLuint texture; // This is a handle to our texture object
GLenum texture_format;
GLint nOfColors;
if (surface)
{
// Check that the image's width is a power of 2
if ( (surface->w & (surface->w - 1)) != 0 )
{
printf("warning: image width is not a power of 2\n");
}
// Also check if the height is a power of 2
if ( (surface->h & (surface->h - 1)) != 0 )
{
printf("warning: image height is not a power of 2\n");
}
// get the number of channels in the SDL surface
nOfColors = surface->format->BytesPerPixel;
if (nOfColors == 4) // contains an alpha channel
{
printf("Alpha: yes");
if (surface->format->Rmask == 0x000000ff)
texture_format = GL_RGBA;
else
texture_format = GL_BGRA;
}
else if (nOfColors == 3) // no alpha channel
{
printf("Alpha: no");
if (surface->format->Rmask == 0x000000ff)
texture_format = GL_RGB;
else
texture_format = GL_BGR;
}
else
{
printf("warning: the image is not truecolor.. this will probably break\n");
// this error should not go unhandled
}


//Needed for 2d textures
glEnable(GL_TEXTURE_2D);

//Needed for transparency
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
glGenTextures( 1, &texture );
glBindTexture( GL_TEXTURE_2D, texture );

// Set the texture's stretching properties
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );


// Edit the texture object's image data using the information SDL_Surface gives us
glTexImage2D( GL_TEXTURE_2D, 0, nOfColors, surface->w, surface->h, 0,
texture_format, GL_UNSIGNED_BYTE, surface->pixels );
}
else
{
printf("SDL could not load image: %s\n", SDL_GetError());
}
if ( surface )
{
SDL_FreeSurface( surface );
}
return texture;
}

This topic is closed to new replies.

Advertisement