Sign in to follow this  
VeryLazyProgrammer

SDL/OPENGL - White texture with alpha blend

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.


[CODE]
#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;
}
[/CODE]

Share this post


Link to post
Share on other sites
szecs    2990
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_[b]BIT[/b] or COLOR_BUFFER_[b]BIT[/b] for example.

GL_TEXTURE_2D, GL_BLEND, DEPTH_BUFFER_[b]BIT[/b], COLOR_BUFFER_[b]BIT[/b] are just [color=#0000ff][i]#define[/i][/color]s 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

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this