VeryLazyProgrammer

Members
  • Content count

    1
  • Joined

  • Last visited

Community Reputation

102 Neutral

About VeryLazyProgrammer

  • Rank
    Newbie
  1. SDL/OPENGL - White texture with alpha blend

    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]