Jump to content
  • Advertisement
Sign in to follow this  

SDL/OPENGL - White texture with alpha blend

This topic is 2227 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

This was just a test program to load my 32 bit transparent PNG file as a texture.

I tested the program without GL_BLEND and ALPHABLEND in the source code... The picture appeared with black borders as expected.
Though, when I try to use GL_BLEND my texture came out entirely white.

#include <string>
#include "SDL/SDL.h"
#include "SDL/SDL_opengl.h"
#include "SDL_image.h"
void Opengl_init()
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
glOrtho (0, 200, 200, 0, 0, 1);
glMatrixMode (GL_MODELVIEW);
glClearColor(.3, .3, .3, 0);

static const Uint32 rmask = 0x000000FF;
static const Uint32 bmask = 0x0000FF00;
static const Uint32 gmask = 0x00FF0000;
static const Uint32 amask = 0xFF000000;
static const Uint32 rmask = 0xFF000000;
static const Uint32 bmask = 0x00FF0000;
static const Uint32 gmask = 0x0000FF00;
static const Uint32 amask = 0x000000FF;
void get_texture(std::string filename)
SDL_Surface * surface = IMG_Load(filename.c_str());
if(surface == NULL)
// could not get filename
SDL_PixelFormat *format = surface->format;

// Create new empty surface.
SDL_Surface* newSurface = SDL_CreateRGBSurface( SDL_SRCALPHA, surface->w , surface->h, 32,rmask, bmask, gmask, amask );
// Fill sprite with alpha.
Uint32 alpha = SDL_MapRGBA( format, 0, 0, 0, amask );
SDL_Rect rect;
rect.x = 0;
rect.y = 0;
rect.h = surface->h;
rect.w = surface->w;
SDL_FillRect( newSurface, &rect, alpha);
surface->flags &= !SDL_SRCALPHA;
// Copy image data to our new surface.
SDL_BlitSurface( surface, 0, newSurface, 0 );
GLuint texture;
// create the texture.
glGenTextures(1, &texture );
glBindTexture(GL_TEXTURE_2D, texture);
// Convert surface to Open GL format.
gluBuild2DMipmaps(GL_TEXTURE_2D, 4,surface->w, surface->h, GL_RGBA,GL_UNSIGNED_BYTE,newSurface->pixels);
// Free our temporary SDL buffers.
SDL_FreeSurface( surface );
SDL_FreeSurface( newSurface );
void DrawProcedure(void)
glBegin( GL_QUADS );
//Upper Left
glTexCoord2f(0, 0);
glVertex2f(0, 0);
//Upper Right
glTexCoord2d(1, 0);
glVertex2f(32, 0);
//Lower Right
glTexCoord2d(1, 1);
glVertex2f(32, 32);
//Lower Left
glTexCoord2d(0 , 1);
glVertex2f(0, 32);
glDisable(GL_TEXTURE_2D| GL_BLEND );

int main(int argc, char **argv)
return -1;
SDL_GL_SetAttribute( SDL_GL_RED_SIZE, 8 );
SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, 8 );
SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, 8 );
SDL_GL_SetAttribute( SDL_GL_ALPHA_SIZE, 8 );
if( SDL_SetVideoMode(200,200, 32, SDL_OPENGL) == NULL)
return -1;
SDL_Event event;
bool Process = true;
while ( SDL_PollEvent(&event) )
switch (event.type)
case SDL_QUIT:
Process = false;
return 0;

Share this post

Link to post
Share on other sites
First of all, i think that's the bug, you can't do this:
glDisable(GL_TEXTURE_2D| GL_BLEND );

You have to have separate glDisable/Enable calls.
My English is too week in the morning to explain why you can't always use the | trick. Look into "bool operations" and "bit masking" if you are interested. GL_TEXTURE_2D and GL_BLEND are not bit masks, like DEPTH_BUFFER_BIT or COLOR_BUFFER_BIT for example.

GL_TEXTURE_2D, GL_BLEND, DEPTH_BUFFER_BIT, COLOR_BUFFER_BIT are just [color=#0000ff]#defines for numbers. The first two can be any number, the last too can be only power-of-two numbers, because those numbers have only one bit set to 1.

The way you do this now will produce a totally different number, so probably neither texturing nor blending will be set the way you expected. Probably both will remain disabled (as they are disabled by default). And you enable some totally different thing. Edited by szecs

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!