C ++ OpenGL BMP и альфа-канал - PullRequest
       45

C ++ OpenGL BMP и альфа-канал

1 голос
/ 12 января 2012

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

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

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

1 Ответ

2 голосов
/ 12 января 2012

У меня есть некоторые BMP-файлы, сохраненные в 32-битной версии через 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;
    }
...