Jump to content
  • Advertisement
Sign in to follow this  
BigBoss_Dv

alpha channel texture problem

This topic is 4481 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

hi guys i have a problem ... i can't load a tga file with alpha values in my program and i don't know what is wrong can you hel me? My init function is :
[source c++]void glInit (void)
{
    glEnable (GL_DEPTH_TEST);
    glPolygonMode (GL_FRONT_AND_BACK, GL_FILL);
	glEnable (GL_BLEND);
	glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
    //ShadeModel (GL_FLAT);
	if (!loadTGA ("terreno.tga", 1))
        printf ("texture.tga not found!\n");
	if (!loadTGA ("clouds.tga", 2))
        printf ("texture.tga not found!\n");
	if (!loadTGA ("omino.tga", 3))
        printf ("texture.tga not found!\n");
}
is it right?


and then in the polygon i have


{glColor4f(1,1,1,0);
		glEnable (GL_TEXTURE_2D);
		glBindTexture (GL_TEXTURE_2D, 3);
		glPushMatrix();//OMINO CHE SALTA//
	glLoadIdentity();
	glTranslatef(x_coord,y_salto,0.0);
	
	glBegin(GL_POLYGON);
		glTexCoord2f(0,0);	
		glVertex2f(-0.5, -0.5);
		glTexCoord2f(0,1);
		glVertex2f(-0.5, 2.5);
		glTexCoord2f(1,1);
		glVertex2f(2.5, 2.5);
		glTexCoord2f(1,0);
		glVertex2f(2.5, -0.5);
	glEnd();
	glDisable (GL_TEXTURE_2D);
	glPopMatrix();
	}

where is the problem? thanks [Edited by - BigBoss_Dv on March 14, 2006 4:20:17 PM]

Share this post


Link to post
Share on other sites
Advertisement
it's a function of the loader of the tga files... maybe the problem is in the tga file... i have done the alpha channel with pain.net but the loader tga don't load the immage... what program can i use to make a tga with alpha channel?

Share this post


Link to post
Share on other sites

/*
Copyright (C) 1999
For non-commercial use only.

File : tga.c
Date : 05/05/1999
Author : Nate Miller
Contact : vandals1@home.com

Change Log
**********
7/26/99 - added code to fclose () a file when there is an error
6/11/99 - added support for 8bit images, changed commenting
*/

#include "tga.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <gl/gl.h>

GLenum texFormat;

/*
=============
checkSize

Make sure its a power of 2.
=============
*/

int checkSize (int x)
{
if (x == 2 || x == 4 ||
x == 8 || x == 16 ||
x == 32 || x == 64 ||
x == 128 || x == 256 || x == 512)
return 1;
else return 0;
}
/*
=============
getRGBA

Reads in RGBA data for a 32bit image.
=============
*/

unsigned char *getRGBA (FILE *s, int size)
{
unsigned char *rgba;
unsigned char temp;
int bread;
int i;

rgba = (unsigned char*) malloc (size * 4);

if (rgba == NULL)
return 0;

bread = fread (rgba, sizeof (unsigned char), size * 4, s);

/* TGA is stored in BGRA, make it RGBA */
if (bread != size * 4)
{
free (rgba);
return 0;
}

for (i = 0; i < size * 4; i += 4 )
{
temp = rgba;
rgba = rgba[i + 2];
rgba[i + 2] = temp;
}

texFormat = GL_RGBA;
return rgba;
}
/*
=============
getRGB

Reads in RGB data for a 24bit image.
=============
*/

unsigned char *getRGB (FILE *s, int size)
{
unsigned char *rgb;
unsigned char temp;
int bread;
int i;

rgb = (unsigned char*) malloc (size * 3);

if (rgb == NULL)
return 0;

bread = fread (rgb, sizeof (unsigned char), size * 3, s);

if (bread != size * 3)
{
free (rgb);
return 0;
}

/* TGA is stored in BGR, make it RGB */
for (i = 0; i < size * 3; i += 3)
{
temp = rgb;
rgb = rgb[i + 2];
rgb[i + 2] = temp;
}

texFormat = GL_RGB;

return rgb;
}
/*
=============
getGray

Gets the grayscale image data. Used as an alpha channel.
=============
*/

unsigned char *getGray (FILE *s, int size)
{
unsigned char *grayData;
int bread;

grayData = (unsigned char*) malloc (size);

if (grayData == NULL)
return 0;

bread = fread (grayData, sizeof (unsigned char), size, s);

if (bread != size)
{
free (grayData);
return 0;
}

texFormat = GL_ALPHA;

return grayData;
}
/*
=============
getData

Gets the image data for the specified bit depth.
=============
*/

char *getData (FILE *s, int sz, int iBits)
{
if (iBits == 32)
return (char*) getRGBA (s, sz);
else if (iBits == 24)
return ( char*) getRGB (s, sz);
else if (iBits == 8)
return ( char*) getGray (s, sz);
}
/*
=============
returnError
=============
Called when there is an error loading the .tga file.
*/

int returnError (FILE *s, int error)
{
fclose (s);
return error;
}
/*
=============
loadTGA

Loads up a targa file. Supported types are 8,24 and 32 uncompressed images.
id is the texture ID to bind too.
=============
*/

int loadTGA (char *name, int id)
{
unsigned char type[4];
unsigned char info[7];
unsigned char *imageData = NULL;
int imageWidth, imageHeight;
int imageBits, size;
FILE *s;

if (!(s = fopen (name, "r+bt")))
return TGA_FILE_NOT_FOUND;

fread (&type, sizeof (char), 3, s); // read in colormap info and image type, byte 0 ignored
fseek (s, 12, SEEK_SET); // seek past the header and useless info
fread (&info, sizeof (char), 6, s);

if (type[1] != 0 || (type[2] != 2 && type[2] != 3))
returnError (s, TGA_BAD_IMAGE_TYPE);

imageWidth = info[0] + info[1] * 256;
imageHeight = info[2] + info[3] * 256;
imageBits = info[4];

size = imageWidth * imageHeight;

/* make sure dimension is a power of 2 */
if (!checkSize (imageWidth) || !checkSize (imageHeight))
returnError (s, TGA_BAD_DIMENSION);

/* make sure we are loading a supported type */
if (imageBits != 32 && imageBits != 24 && imageBits != 8)
returnError (s, TGA_BAD_BITS);

imageData = (unsigned char *) getData (s, size, imageBits);

/* no image data */
if (imageData == NULL)
returnError (s, TGA_BAD_DATA);

fclose (s);

glBindTexture (GL_TEXTURE_2D, id);
glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
/* glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); */
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
/* glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); */
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexImage2D (GL_TEXTURE_2D, 0, texFormat, imageWidth, imageHeight, 0, texFormat, GL_UNSIGNED_BYTE, imageData);

/* release data, its been uploaded */
free (imageData);

return 1;
}



[Edited by - BigBoss_Dv on March 14, 2006 12:40:54 AM]

Share this post


Link to post
Share on other sites
Edit your post and post the code inside source-tags. See the FAQ for more information on how to do that. Pesonally, I tent to just ignore posts that just dumps poorly formatted code in the post like that.

Looks like a pre-made function though, so likely the file itself that is wrong. But as I said, I haven't bothered looking much at the code in the way it is now.

Share this post


Link to post
Share on other sites
Can't see anything wrong with the TGA loader itself. What do you actually get? Correct RGB but wrong A, or no texture at all? Do you know for sure the image is correct? Tried debugging the code to see if it fails somewhere? It is just RGBA images that fails, or does RGB images fail aswell?

Share this post


Link to post
Share on other sites
only rgba fails... i have tried with this other loader but either this doesn't work with alpha channel
[source c++]/*
* PNG loader library for OpenGL v1.45 (10/07/00)
* by Ben Wyatt ben@wyatt100.freeserve.co.uk
* Using LibPNG 1.0.2 and ZLib 1.1.3
*
* This software is provided 'as-is', without any express or implied warranty.
* In no event will the author be held liable for any damages arising from the
* use of this software.
*
* Permission is hereby granted to use, copy, modify, and distribute this
* source code, or portions hereof, for any purpose, without fee, subject to
* the following restrictions:
*
* 1. The origin of this source code must not be misrepresented. You must not
* claim that you wrote the original software. If you use this software in
* a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
* 2. Altered versions must be plainly marked as such and must not be
* misrepresented as being the original source.
* 3. This notice must not be removed or altered from any source distribution.
*/


#ifndef _GLPNG_H_
#define _GLPNG_H_

#include <stdio.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifdef _MSC_VER
#ifdef _DEBUG
#pragma comment (lib, "glpngd.lib")
#else
#pragma comment (lib, "glpng.lib")
#endif
#endif

/* XXX This is from Win32's <windef.h> */
#ifndef APIENTRY
#if (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)
#define APIENTRY __stdcall
#else
#define APIENTRY
#endif
#endif

/* Mipmapping parameters */
#define PNG_NOMIPMAPS 0 /* No mipmapping */
#define PNG_BUILDMIPMAPS -1 /* Calls a clone of gluBuild2DMipmaps() */
#define PNG_SIMPLEMIPMAPS -2 /* Generates mipmaps without filtering */

/* Who needs an "S" anyway? */
#define PNG_NOMIPMAP PNG_NOMIPMAPS
#define PNG_BUILDMIPMAP PNG_BUILDMIPMAPS
#define PNG_SIMPLEMIPMAP PNG_SIMPLEMIPMAPS

/* Transparency parameters */
#define PNG_CALLBACK -3 /* Call the callback function to generate alpha */
#define PNG_ALPHA -2 /* Use alpha channel in PNG file, if there is one */
#define PNG_SOLID -1 /* No transparency */
#define PNG_STENCIL 0 /* Sets alpha to 0 for r=g=b=0, 1 otherwise */
#define PNG_BLEND1 1 /* a = r+g+b */
#define PNG_BLEND2 2 /* a = (r+g+b)/2 */
#define PNG_BLEND3 3 /* a = (r+g+b)/3 */
#define PNG_BLEND4 4 /* a = r*r+g*g+b*b */
#define PNG_BLEND5 5 /* a = (r*r+g*g+b*b)/2 */
#define PNG_BLEND6 6 /* a = (r*r+g*g+b*b)/3 */
#define PNG_BLEND7 7 /* a = (r*r+g*g+b*b)/4 */
#define PNG_BLEND8 8 /* a = sqrt(r*r+g*g+b*b) */

typedef struct {
unsigned int Width;
unsigned int Height;
unsigned int Depth;
unsigned int Alpha;
} pngInfo;

typedef struct {
unsigned int Width;
unsigned int Height;
unsigned int Depth;
unsigned int Alpha;

unsigned int Components;
unsigned char *Data;
unsigned char *Palette;
} pngRawInfo;

extern int APIENTRY pngLoadRaw(const char *filename, pngRawInfo *rawinfo);
extern int APIENTRY pngLoadRawF(FILE *file, pngRawInfo *rawinfo);

extern int APIENTRY pngLoad(const char *filename, int mipmap, int trans, pngInfo *info);
extern int APIENTRY pngLoadF(FILE *file, int mipmap, int trans, pngInfo *info);

extern unsigned int APIENTRY pngBind(const char *filename, int mipmap, int trans, pngInfo *info, int wrapst, int minfilter, int magfilter);
extern unsigned int APIENTRY pngBindF(FILE *file, int mipmap, int trans, pngInfo *info, int wrapst, int minfilter, int magfilter);

extern void APIENTRY pngSetStencil(unsigned char red, unsigned char green, unsigned char blue);
extern void APIENTRY pngSetAlphaCallback(unsigned char (*callback)(unsigned char red, unsigned char green, unsigned char blue));
extern void APIENTRY pngSetViewingGamma(double viewingGamma);
extern void APIENTRY pngSetStandardOrientation(int standardorientation);

#ifdef __cplusplus
}
#endif

#endif




Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

Participate in the game development conversation and more when you create an account on GameDev.net!

Sign me up!