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