Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Текстурирование в OpenGL


Автор: Wolf 25.6.2006, 22:23
Доброго времени суток!

У меня возник один вопрос: Как на плоскость наложить текстуру, причём чтобы плоскость отображалась (её прозрачность) в соответствии с альфа каналом. Файл считываю из 32 битного BMP. У такого файла байты цветов идут в таком порядке B G R A. Всё учтено.

Код

GLvoid *ReadBitmap(const char FileName[])
{
    const unsigned int SizeBFH = 14;
    const unsigned int SizeBIH = 40;

    BITMAPFILEHEADER BFH;
    BITMAPINFOHEADER BIH;
    DWORD BMPSize = 0;
    GLbyte temp, r, b;
    GLbyte *pos;
    HGLOBAL mempointer;

    DWORD Readed = 0;

    HANDLE fBMPFL = CreateFile(FileName, GENERIC_READ,
                               FILE_SHARE_READ, NULL,
                               OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
                               NULL);

    BMPSize = GetFileSize(fBMPFL, NULL);

    mempointer = GlobalAlloc(GMEM_FIXED, BMPSize);

    ReadFile(fBMPFL, &BFH, SizeBFH, &Readed, NULL);
    ReadFile(fBMPFL, &BIH, SizeBIH, &Readed, NULL);
    ReadFile(fBMPFL, mempointer, BMPSize-(SizeBFH+SizeBIH), &Readed, NULL);

    if (BFH.bfType!=0x4D42)
    {
        MessageBox(NULL, "Ошибка загрузки текстуры", "Error!!!",
                   MB_ICONERROR | MB_OK);

        return NULL;
    }

    sWidth=BIH.biWidth;
    tHeight=BIH.biHeight;

    CloseHandle(fBMPFL);

    pos=(GLbyte *)mempointer;

    for (int i=0; i<sWidth*tHeight; i++) //преобразовывает BGRA в RGBA
    {
        r=*pos;
        b=*(++(++pos));
        *pos=r;
        *(--(--pos))=b;
        pos+=3;
        *pos=0;
        pos++;
    }

    return mempointer;
}


функция прекрасно работает, выделяет память, а дальше в какой последовательности должны ити команды. У меня текстура накладывается, но альфа канал игнорируется. GL_BLEND включал... В чём же проблема?

P.S. Функцию привёл потому, что надо сделать без использования масок и прочих отдельных файлов...

вот ещё два кусочка, которые в моей программке отвечают за инициализацию текстуры и инициализацию дисплейного списка, отрисовывающего плоскость

Код

void InitTexture(const char filename[])
{
    GLvoid *pmem;

    pmem=ReadBitmap(filename);

    glTexImage2D(GL_TEXTURE_2D, 0, 3, sWidth, tHeight, 0,
                 GL_RGBA, GL_UNSIGNED_BYTE, pmem);


    GlobalFree((HGLOBAL) pmem);

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

    glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}

void InitDisplayList()
{
    glNewList(LOGOCHOORD, GL_COMPILE);
        glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
        glTexCoord2d(1.0, 1.0);        glVertex3f(-1.0f, 0.55f, 0.0f);
        glTexCoord2d(0.0, 1.0);        glVertex3f(1.0f, 0.55f, 0.0f);
        glTexCoord2d(0.0, 0.0);        glVertex3f(1.0f, -0.55f, 0.0f);
        glTexCoord2d(1.0, 0.0);        glVertex3f(-1.0f, -0.55f, 0.0f);
    glEndList();
}


программирую Visual C++ WinAPI 

Автор: p0s0l 26.6.2006, 09:01
На первый взгляд - в glTexImage2D указано что используется 3 компоненты, а надо 4 (это про третий параметр)...

PS: Кстати, есть формат GL_BGRA_EXT (не нужно будет преобразование).. 

Автор: Wolf 26.6.2006, 10:57
p0s0l, Примного благодарен, исправил, вот теперь всё прекрасно  smile  

Автор: ynter 27.6.2006, 14:05
Доброго времени суток!

Но насколько я понимаю это помогает сделать текстуру более бледной, но ни как ни прозрачной по отношению к фону? А меня как раз интересует второе...

 

Автор: Wolf 27.6.2006, 16:01
ynter, Как раз речь и идёт об изменение прозрачности относительно фона, причём изменить прозрачность можно каждой точки текстуры. Для этого и нужен альфа канал. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)