OpenGL: Загрузка текстур

OpenGL: Загрузка текстур

Сегодня я вам покажу как в OpenGL можно загружать текстуры.

Для этого нам понадабиться библеотека DevIL. Скачать ее можно сдесь: http://openil.sourceforge.net/


Итак первым делом подключаем необходимые библеотеки: DevIL.lib, ilut.lib, ilu.lib.

Подключаем необходимые хидеры: il.h, ilu.h, ilut.h.


Класс загрузчика будет выглядеть вот так:

class CTexture
{
private:
UINT id; // Идентификатор созданой текстуры
int m_width, m_height;// Размеры тексуры
public:
CTexture();
~CTexture();

/* Загружает изображение: fileName - Путь к загружаемому изображению; hexARGB - Вместо этого цвета будет добавлен альфа-канал. *
bool LoadFromFile(const char* fileName, int hexARGB);
/* Возвращаяет ширину созданой текстуры */
int GetWidth(void);
/* Возвращаяет высоту созданой текстуры */
int GetHeight(void);
/* Возвращаяет идентификатор созданой текстуры */
UINT GetID(void);
/* Удаляет созданую текстуру. */
void Free(void);
};
Для загрузки текстуры создадим структуру:
struct tImage
{
int bpp; // Число битов на пиксель
int width; // Ширина
int height; // Высота
GLubyte *data;// Пиксели изображения
};
В конструкторе класса инициализируем библеотеку DevIL:
CTexture::CTexture()
{
ilInit(); //
iluInit(); // Инициализация библеотек il.dll ilu.dll ilut.dll
ilutInit();//
}

Переходим к самому главному, загрузке текстуры! При загрузке текстуры, если у нее не будет альфа-канала, то его можно будет добавить вместо кокогото цвета. Для этого нужно будет в параметре hexARGB указать цвет (например белый: 0xFFFFFF).
Если альфа-канал добавлять ненужно, то в параметре hexARGB нужно указать -1.

bool CTexture::LoadFromFile(const char* fileName, int hexARGB)
{
DWORD R, G, B;
if( hexARGB != -1 )
{
B = ( hexARGB&0xFF );
G = (( hexARGB&0xFF00 ) >> 8 );
R = (( hexARGB&0xFF0000 ) >> 16 );
}

UCHAR *alpha_texture = NULL;
long texel = 0;

int IL_TYPE = IL_TYPE_UNKNOWN;

/* Определяем тип изображения */
if( strstr(fileName, ".jpg") || strstr(fileName, ".JPG") || strstr(fileName, ".jpeg") || strstr(fileName, ".JPEG") )
{
IL_TYPE = IL_JPG;
}
else
if( strstr(fileName, ".tga") || strstr(fileName, ".TGA") )
{
IL_TYPE = IL_TGA;
}
else
if( strstr(fileName, ".bmp") || strstr(fileName, ".BMP") ){
IL_TYPE = IL_BMP;
}
else
IL_TYPE = IL_TYPE_UNKNOWN;

ilEnable(IL_ORIGIN_SET); //
// Переворачиваем изображение
ilOriginFunc(IL_ORIGIN_LOWER_LEFT);//

ilLoad(IL_TYPE, (char*)fileName); // Загружаем изображение

if( ilGetError() != IL_NO_ERROR ) // Если произошла ошибка, то выходим
return false;

tImage img;

img.width = ilGetInteger(IL_IMAGE_WIDTH); // Получаем ширину изображения
img.height = ilGetInteger(IL_IMAGE_HEIGHT); // Получаем высоту изображения
img.bpp = ilGetInteger(IL_IMAGE_BYTES_PER_PIXEL);// Получаем число битов на пиксель
img.data = ilGetData(); // Получаем пиксели изображения

ilEnable(IL_CONV_PAL);

UINT type = ilGetInteger(IL_IMAGE_FORMAT); // Получаем формат изображения

if( type == IL_BGR || type == IL_BGRA ) //
if ( type == IL_BGR ) type = IL_RGB; // Если фомат BGR или BGRA, то делаем RGB или RGBA
if ( type == IL_BGRA ) type = IL_RGBA; //
iluSwapColours();
}

/* Если нужно, то добавляем альфа-канал */
if((img.bpp == 3) && ( hexARGB != -1 ))
{
alpha_texture = new UCHAR[img.width * img.height * 4 + 1];
for(texel = 0; texel < long(img.width * img.height); texel++)
{
alpha_texture[texel*4] = img.data[texel*3];
alpha_texture[texel*4+1] = img.data[texel*3+1];
alpha_texture[texel*4+2] = img.data[texel*3+2];

if( img.data[texel*3] == R && img.data[texel*3+1] == G && img.data[texel*3+2] == B )
alpha_texture[texel*4+3] = 0;
else
alpha_texture[texel*4+3] = 255;
}
}

glGenTextures(1, &id); // Генерируем уникальное имя для текстур
glBindTexture(GL_TEXTURE_2D, id);// Выбираем текстуру

if( ( img.bpp == 3 ) && ( alpha_texture != NULL ) )
gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, img.width, img.height, GL_RGBA, GL_UNSIGNED_BYTE, alpha_texture);// Создаем текстуру
else
gluBuild2DMipmaps(GL_TEXTURE_2D, img.bpp, img.width, img.height, type, GL_UNSIGNED_BYTE, img.data); //

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // Выбираем фильтрацию для текстуры
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);//

m_width = img.width;
m_height = img.height;

if(alpha_texture != NULL)
{
delete [] alpha_texture;
}

glBindTexture(GL_TEXTURE_2D, 0);

return true;
}
Удаляем созданую текстуру
void CTexture::Free()
{
glDeleteTextures(1, &id);
}
На этом все. Если возникли вопросы, то пишите СЮДА

Внимание!!! Если если хотите разместить эту статью у себя на сайте, то укажите ссылку на мой сайт и мое авторство (Лупсяков Д.А.)



Автор: Лупсяков Д.А. | Добавлено: 16.9.2009, 8:55 | Просмотров: 15569
Добавить комментарий


Лучшие программы
Будильник
Lim BurnDisc
Радио плеер
Lim BackUp
Календарь праздников
Телефонный справочник
Аудио конвертер
LimNote
Стикеры
Таймер выключения
Женский календарь
Клавиатурный тренажер
Lim Block Folder
Lim Screenshot
Lim Tree Note
Lim Soft Catalog
Lim Quick Panel
Lim Frame Photo
Lim Image Marker
Lim Flash Security
Lim Launcher
Lim Mosaic Draw
Рисовалка для детей (Котики)
Школьный звонок
Lim Catalog Articles
Lim Anti Boss
Рисовалка для детей (Машинки)
...

Игры
Пасьянс Паганини
Игра_2048
Игра Cursor Run
Пасьянс Косынка
Пасьянс Паук
Игра Server War
Server War History AI
Складское дело
Крестики - Нолики 5 в линию
Сапер
Точки и квадраты
Судоку

Программы
Блог
Комментарии
произошла ошибка, ис...
Ужасно неудобная гос...
Согласен трансляция ...
P.s. Практически каж...
...
Добрый день! Как исп...
День добрый! недавно...
Все исправлено. Спас...
Добрый день! Исправь...
Добрый день на 10ке,...
Группа VK
Поделиться





Копилка MaxLim.

Если Вам понравилась наша программа, Вы можете купить нам кофе (или кофемашину) или пивка для поднятия настроения и ускорения написания новых программ и обновлений :), Пополните копилку и разработка программ ускорится :)...
Пополнить копилку можно несколькими способами:

1. Переводом через Сбербанк Онлайн - Платежи, Перевод клиенту сбербанка по номеру телефона "Номер телефона - +79284741288" -сумма перевода в рублях.
2. Кошелек Яндекс Деньги - 41001737394948
3. Через донаты...

Контакты для связи:
Skype - go_ramalex
mail - maxlim_soft@mail.ru

Яндекс.Метрика PR-CY.ru Яндекс цитирования
MaxLim.org - Сайт Компании MaxLim http://vsofte.biz MaxLim.org - Сайт programs.lv SoftOut.ru - Сайт SoftOut.ru  

Copyright MaxLim © 2007-2023