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