Sign in to follow this  
mc30900

OpenGL problem with drawing a png texture

Recommended Posts

hello all. i loaded with SDL (i'm using sdl+opengl) a png texture (Rgba). the texture in photoshop has no background. but in my program it has white background. any idea why this is happening and how i can fix this? thanks in advance

Share this post


Link to post
Share on other sites
In photoshop, the background is transparent and when it saves it out to a file, it is most likely just saving the transparent portions as white with the alpha value set to 0. You'll either want to use the alpha test or blending to remove the white portion.

Share this post


Link to post
Share on other sites
glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0.1f);

or

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

Use blend for smooth edges. Use the alpha test to remove fragments faster during the raster process.

Share this post


Link to post
Share on other sites
Older versions of photoshop don't support saving alpha data in png files through the save as command. Instead you need to use the save for web command.

Share this post


Link to post
Share on other sites
i tried :

glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0.1f);



but it didnt help.
then i tried to save the png in photoshop with the "Save for web" option but then when i load the texture with rgba it looks very strange so i can only load it with rgb.

anyone has any idea what i need to do?
thanks in advance


p.s mybe i'm loading the png wrong? here is the code:


int LoadGLTextures( )
{
/* Status indicator */
int Status = FALSE;

/* Create storage space for the texture */
SDL_Surface *TextureImage[6];

/* Load The Bitmap, Check For Errors, If Bitmap's Not Found Quit */
if (
//( TextureImage[0] = IMG_Load( "data/tank.jpg" ) )
( TextureImage[0] = IMG_Load( "data/tank.bmp" ) )

&& ( TextureImage[1] = IMG_Load( "data/wall1.jpg" ) )
&& ( TextureImage[2] = IMG_Load( "data/a.png" ) )&& ( TextureImage[3] = IMG_Load( "data/wall3.jpg" ) )
&& ( TextureImage[4] = IMG_Load( "data/tankmenu.jpg" ) )
&& ( TextureImage[5] = IMG_Load( "data/rocket.jpg" ) )

)
{

/* Set the status to true */
Status = TRUE;

/* Create The Texture */
glGenTextures( 6, &texture[0] );
for (int i=0;i<6;i++)
{
/* Typical Texture Generation Using Data From The Bitmap */
glBindTexture( GL_TEXTURE_2D, texture[i] );


/* Linear Filtering */
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
GL_LINEAR_MIPMAP_NEAREST );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
GL_LINEAR );
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);


if (i==2)
{
gluBuild2DMipmaps( GL_TEXTURE_2D, 3, TextureImage[i]->w,
TextureImage[i]->h, GL_RGBA,
GL_UNSIGNED_BYTE, TextureImage[i]->pixels );
}
else
{
gluBuild2DMipmaps( GL_TEXTURE_2D, 3, TextureImage[i]->w,
TextureImage[i]->h, GL_RGB,
GL_UNSIGNED_BYTE, TextureImage[i]->pixels );
}
}

}

/* Free up any memory we may have used */
for (int z=0;z<6;z++)
{
if ( TextureImage[z] )
SDL_FreeSurface( TextureImage[z] );
}
return Status;
}




[Edited by - mc30900 on August 17, 2006 2:32:03 AM]

Share this post


Link to post
Share on other sites
now i also saw that in nehe tutorial (32) his tga textures have a alpha channel in PHOTOSHOP and my png dont have that.... should i add that???

Share this post


Link to post
Share on other sites
Quote:

gluBuild2DMipmaps( GL_TEXTURE_2D, 3, TextureImage[i]->w,
TextureImage[i]->h, GL_RGBA,
GL_UNSIGNED_BYTE, TextureImage[i]->pixels );

I don't know exactly how the 'internal format' argument of gluBuild2DMipmaps works (are you allowed to use GL enumerants for sized internal formats?) but at any rate, 3 means that you are telling GL to keep 3 channels (RGB) of the image. It needs to be 4 (or GL_RGBA8 if allowed).

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