Witam! Mam problem z teksturowaniem z użyciem kanału alfa. Próbuję na kwadrat nałożyć teksturę (zrobioną własnoręcznie w gimpie). Jeżeli tekstura nie używa kanału alfa to wszystko jest OK. Jeżeli używam kanał alfa to tam, gdzie piksel powinien być przezroczysty jest biały. Tekstury zapisuję w fromacie .targa. Do wczytywania tekstur używam funkcji z książki "OpenGL w praktyce" Janusza Ganczarskiego (funkcja load_targa). Poniżej przedstawiam kod źródłowy. Jestem początkujący w OpenGL i proszę o wyrozumiałość. Z góry dziękuję za pomoc.

Pierwsza funkcja to load_targa z książki "OpenGL w praktyce", więc tam raczej błędu nie ma.

#include <GL/glut.h>
#include <stdio.h>
#include <string.h>
#define TARGA_HEADER_SIZE 0x12
#define TARGA_UNCOMP_RGB_IMG 0x02
#define TARGA_UNCOMP_BW_IMG 0x03

GLboolean load_targa( const char * filename, GLsizei & width, GLsizei & height, GLenum & format, GLenum & type, GLvoid *& pixels )
{
    pixels = NULL;
    width = 0;
    height = 0;
    FILE * tga = fopen( filename, "rb" );
    if( !tga )
         return GL_FALSE;
    unsigned char header[ TARGA_HEADER_SIZE ];
    fread( header, TARGA_HEADER_SIZE, 1, tga );
    fseek( tga, header[ 0 ], SEEK_CUR );
    width = header[ 12 ] +( header[ 13 ] << 8 );
    height = header[ 14 ] +( header[ 15 ] << 8 );
    if( header[ 2 ] == TARGA_UNCOMP_RGB_IMG && header[ 16 ] == 24 )
    {
        pixels = new unsigned char[ width * height * 3 ];
        fread(( void * ) pixels, width * height * 3, 1, tga );
        format = GL_BGR;
        type = GL_UNSIGNED_BYTE;
    }
    else
    if( header[ 2 ] == TARGA_UNCOMP_RGB_IMG && header[ 16 ] == 32 )
    {
        pixels = new unsigned char[ width * height * 4 ];
        fread(( void * ) pixels, width * height * 4, 1, tga );
        format = GL_BGRA;
        type = GL_UNSIGNED_BYTE;
    }
    else
    if( header[ 2 ] == TARGA_UNCOMP_BW_IMG && header[ 16 ] == 8 )
    {
        pixels = new unsigned char[ width * height ];
        fread(( void * ) pixels, width * height, 1, tga );
        format = GL_LUMINANCE;
        type = GL_UNSIGNED_BYTE;
    }
    else
         return GL_FALSE;
    fclose( tga );
    return GL_TRUE;
}

void Generate()
{
	GLsizei width, height;
	GLenum format, type;
	GLvoid *pixels;

	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

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

	GLboolean error = load_targa("targa.tga", width, height, format, type, pixels);
	if(error == GL_FALSE)
	{
		printf("Niepoprawny odczyt pliku targa.tga");
		exit(0);
	}
	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, format, type, pixels);
	glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
	glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
}

void DisplayScene()
{
	glClearColor(1.0, 1.0, 1.0, 1.0);
	glClear(GL_COLOR_BUFFER_BIT);
	glColor3f(1.0, 0.0, 0.0);
	glBegin(GL_POLYGON);
	glTexCoord2f(0.0, 0.0);
	glVertex3f(0.0, 0.0, 0.0);
	glTexCoord2f(0.0, 1.0);
	glVertex3f(0.0, 1.0, 0.0);
	glTexCoord2f(1.0, 1.0);
	glVertex3f(1.0, 1.0, 0.0);
	glTexCoord2f(1.0, 0.0);
	glVertex3f(1.0, 0.0, 0.0);
	glEnd();
	glFlush();
	glutSwapBuffers();
}

int main(int argc, char *argv[])
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
	glutInitWindowSize(512, 512);
	glutCreateWindow("Tekstura");
	Generate();
        glutDisplayFunc(DisplayScene);
        glutMainLoop();
	return 0;
}