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 | Просмотров: 15683