2012-01-12 2 views
1

У меня есть BMP, сохраненный в 32bit через Photoshop. Первый 24 бит должен представлять RGB, а последний 8 бит должен представлять альфа-канал. я загружаю мои растровый:C++ opengl bmp и альфа-канал

Bitmap* bStart = new Bitmap("starten.bmp"); 

Я загрузка файла и установку значений для альфа-канала

Bitmap::Bitmap(const char* filename) { 
    FILE* file; 
    file = fopen(filename, "rb"); 

    if(file != NULL) { // file opened 
     BITMAPFILEHEADER h; 
     fread(&h, sizeof(BITMAPFILEHEADER), 1, file); //reading the FILEHEADER 
     fread(&this->ih, sizeof(BITMAPINFOHEADER), 1, file); 

     this->pixels = new GLbyte[this->ih.biHeight * this->ih.biWidth * this->ih.biBitCount/8]; 
     fread(this->pixels, this->ih.biBitCount/8 * this->ih.biHeight * this->ih.biWidth, 1, file); 
     fclose(file); 

     for (int i = 3; i < this->ih.biHeight * this->ih.biWidth * this->ih.biBitCount/8; i+=4) { 
      this->pixels[i] = 255; 
     } 
    } 
} 

Установки текстуры:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bStart->ih.biWidth, bStart->ih.biHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, bStart->pixels); 

в инициализацию вещи :

glutInit(argcp, argv); 
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA | GLUT_DEPTH); 

//not necessary because we using fullscreen 
//glutInitWindowSize(550, 550); 
//glutInitWindowPosition(100, 100); 

glutCreateWindow(argv[0]); //creating the window 
glutFullScreen(); //go into fullscreen mode 

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
glEnable(GL_BLEND); 
glShadeModel(GL_SMOOTH); 
glEnable(GL_DEPTH_TEST); 
glPixelStorei(GL_UNPACK_ALIGNMENT, 1); //art und weise wie texturen gespeicehrt werden 

glClearColor (1.0, 0.6, 0.4, 0.0); 

//setting the glut functions 
glutDisplayFunc(displayCallback); 
glutKeyboardFunc(keyboardCallback); 

glutMainLoop(); //starting the opengl mainloop... and there we go 

Я могу видеть свои текстуры в своем приложении, но их фон не прозрачен ... это своего рода светло-голубой. Что я делаю неправильно?

ответ

2

У меня есть BMP, сохраненный в 32bit через Photoshop. Первый 24 бит должен представлять RGB, а последний 8 бит должен представлять альфа-канал.

Хотя это возможно реализовать, такой альфа-канал в DIB-файле (это то, что на самом деле называется структурой .BMPs) никогда не был задан должным образом. Так что это может просто не сохраниться вообще. Но это не имеет значения, как вы перезаписать значения альфа с 1 в вашем DIB грузчиком ... Я имею в виду, что часть:

for (int i = 3; i < this->ih.biHeight * this->ih.biWidth * this->ih.biBitCount/8; i+=4) { 
     this->pixels[i] = 255; 
    } 
+0

да 4-й канал объявлен как X и я красный, это следует хранить некоторая информация о заполнении ... вот почему я сам переписываю байт. – soupdiver

+0

@skelle: так, как вы думаете, тогда альфа хранится? также это противоречит первому предложению вашего вопроса. –

+0

@TomWhittock Альфа-канал должен храниться в 4-м канале, который я переписываю с 255 для каждого пикселя. Также я говорю, что моя текстура использует RGBA, но я не получаю прозрачный фон. – soupdiver