Jump to content

  • Log In with Google      Sign In   
  • Create Account


VeryLazyProgrammer

Member Since 12 Jun 2012
Offline Last Active Jun 12 2012 08:44 PM
-----

Topics I've Started

SDL/OPENGL - White texture with alpha blend

12 June 2012 - 04:51 PM

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;
}

PARTNERS