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