Jump to content

  • Log In with Google      Sign In   
  • Create Account


saschaheylik

Member Since 30 Mar 2012
Offline Last Active Apr 23 2012 11:18 AM
-----

Posts I've Made

In Topic: SDL openGL PNG transparency?

30 March 2012 - 07:41 PM

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

PARTNERS