Копилка MaxLim.

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

1. Переводом через мобильный банк Сбербанка - Отправить на номер 900 смс содержания "ПЕРЕВОД 9284741288 100" - где последняя цифра это сумма перевода.
2. Кошелек WebMoney - R809881130844
3. Кошелек Яндекс Деньги - 41001737394948

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

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 | Просмотров: 10754
Добавить комментарий


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

Программы
Блог
Комментарии
Программа супер, мне...
Протестено, оказывае...
Не устанавливается н...
Здравствуйте. скопир...
Здравствуйте. Скажит...
Дальше iedb файл мож...
В этой программе ест...
В какой программе?...
Пожалуста проверьте ...
Желательна версия Po...
Группа VK
Поделиться






Яндекс.Метрика PR-CY.ru Яндекс цитирования

MaxLim.org - Сайт Компании MaxLim http://vsofte.biz MaxLim.org - Сайт Компании MaxLim MaxLim.org - Сайт programs.lv SoftOut.ru - Сайт SoftOut.ru  

Copyright MaxLim © 2007-2017