Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Текстурирование в OpenGL, Наложение текстуры с альфа каналом 
:(
    Опции темы
Wolf
Дата 25.6.2006, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 9.6.2006
Где: Нижневартовск

Репутация: нет
Всего: нет



Доброго времени суток!

У меня возник один вопрос: Как на плоскость наложить текстуру, причём чтобы плоскость отображалась (её прозрачность) в соответствии с альфа каналом. Файл считываю из 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 
PM MAIL ICQ   Вверх
p0s0l
Дата 26.6.2006, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 2
Всего: 112



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

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


--------------------
С уважением, г-н Посол.
PM   Вверх
Wolf
Дата 26.6.2006, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 9.6.2006
Где: Нижневартовск

Репутация: нет
Всего: нет



p0s0l, Примного благодарен, исправил, вот теперь всё прекрасно  smile  
PM MAIL ICQ   Вверх
ynter
Дата 27.6.2006, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 27.6.2006

Репутация: нет
Всего: нет



Доброго времени суток!

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

 
PM MAIL   Вверх
Wolf
Дата 27.6.2006, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 9.6.2006
Где: Нижневартовск

Репутация: нет
Всего: нет



ynter, Как раз речь и идёт об изменение прозрачности относительно фона, причём изменить прозрачность можно каждой точки текстуры. Для этого и нужен альфа канал. 
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.0913 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.