SDL/OPENGL - White texture with alpha blend

Started by
0 comments, last by szecs 11 years, 10 months ago
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);
glDisable(GL_DEPTH_TEST);
glMatrixMode (GL_MODELVIEW);
glLoadIdentity();
glClearColor(.3, .3, .3, 0);
glClear(GL_COLOR_BUFFER_BIT);
}

#if SDL_BYTEORDER == SDL_LIL_ENDIAN
static const Uint32 rmask = 0x000000FF;
static const Uint32 bmask = 0x0000FF00;
static const Uint32 gmask = 0x00FF0000;
static const Uint32 amask = 0xFF000000;
#else
static const Uint32 rmask = 0xFF000000;
static const Uint32 bmask = 0x00FF0000;
static const Uint32 gmask = 0x0000FF00;
static const Uint32 amask = 0x000000FF;
#endif
void get_texture(std::string filename)
{
SDL_Surface * surface = IMG_Load(filename.c_str());
if(surface == NULL)
{
// could not get filename
return;
}
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;
SDL_SetAlpha( newSurface, SDL_SRCALPHA, SDL_ALPHA_TRANSPARENT );
// Copy image data to our new surface.
SDL_BlitSurface( surface, 0, newSurface, 0 );
GLuint texture;
// create the texture.
glPixelStorei(GL_UNPACK_ALIGNMENT,4);
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)
{
glEnable(GL_TEXTURE_2D|GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
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);
glEnd();
glDisable(GL_TEXTURE_2D| GL_BLEND );
}

int main(int argc, char **argv)
{
if(SDL_Init(SDL_INIT_EVERYTHING) < 0 )
return -1;
SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 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;
Opengl_init();
get_texture("Sign.png");
DrawProcedure();
SDL_GL_SwapBuffers();
SDL_Event event;
bool Process = true;
while(Process)
while ( SDL_PollEvent(&event) )
switch (event.type)
{
case SDL_QUIT:
Process = false;
}
SDL_Quit();
return 0;
}
Advertisement
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.

This topic is closed to new replies.

Advertisement