Jump to content

  • Log In with Google      Sign In   
  • Create Account

FREE SOFTWARE GIVEAWAY

We have 4 x Pro Licences (valued at $59 each) for 2d modular animation software Spriter to give away in this Thursday's GDNet Direct email newsletter.


Read more in this forum topic or make sure you're signed up (from the right-hand sidebar on the homepage) and read Thursday's newsletter to get in the running!


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