Войти
ПрограммированиеСтатьиГрафика

Библиотека OpenIL

Автор:

Привет всем! Я расскажу, как пользоваться простой и удобной библиотекой для загрузки изображения из графических файлов различных форматов. Библиотека OpenIL также известная как DevIL (второе название дали из-за вопросов торговой марки) свободно распространяемая.

Данная статья рассчитана на программистов, использующих библиотеку OpenGL. Для загрузки многих графических форматов требуется изучать структуру формата и самому писать код загрузки, либо например, использовать сторонние библиотеки для каждого формата отдельно что не всегда удобно. Например, для загрузки jpg многие используют библиотеку Intel Jpeg Liblary или jpeglib, для загрузки формата png используют libpng и т.д. В противоположность этому библиотека OpenIL (DevIl) универсальна, она объединяет в себе загрузку всех перечисленных форматов, также она позволяет грузить другие форматы менее распространенные (хотя в последнем я могу ошибиться :)).

Итак, как же пользоваться библиотекой? Все очень просто. Для начала скопируйте ее на диск. Создайте там папку например OpenIL. Внутри нее создайте папку include и папку lib. В папке include создайте папку il. В папку include\il нужно скопировать заголовочные файлы библиотеки с расширением *.h. В папку lib — файлы библиотеки с расширением *.lib. Далее, в среде разработке нужно указать путь к папке OpenIL\include и к папке OpenIL\lib.

Для Visual C++ 6.0 это делается так:
Tools->Options->Directoties->Include files тут надо выбрать путь к папке ..\OpenIL\include\il
Tools->Options->Directoties->Library files тут надо выбрать путь к папке ..\OpenIL\lib

Для Visual C++ .Net это делается так:
Tools->Options->Projects->VC++ Directoties->Include files тут надо выбрать путь к папке ..\OpenIL\include\il
Tools->Options->Projects->VC++Directoties->Library files тут надо выбрать путь к папке ..\OpenIL\lib

Также, для работы библиотеки нужны динамически подключаемые библиотеки. Их можно скинуть в каталог windows\system32 или положить в текущую папку проекта. Для минимального использования возможностей библиотеки нужен файл devil.dll в этой библиотеке содержаться основные функции OpenIL (DevIl). Кроме того, библиотека содержит набор утилит находящихся в файлах ilu.dll и ilut.dll для их использования эти файлы должны присутствовать в папках описанных выше.

Пример использования библиотеки.

Тут я расскажу, как можно загрузить текстуру из графического файла.

Названия всех основных функций начинаются с префикса il, предопределяемые макросы начинаются с IL_, прототипы функций и макросы находиться в заголовочном файле il\il.h. Аналогично можно сказать об утилитах ilu и ilut все это находиться в файлах
il\ilu.h и il\ilut.h.

Для начала библиотеку нужно проинициализировать. Для инициализации основной библиотеке вызывается функция ilInit();. Для остальных библиотек утилит iluInit(); и ilutInit(); Нам понадобиться только iluInit();

Итак, инициализация библиотеки:

#include <il\il.h> // здесь есть такая строка #pragma comment(lib, "devil.lib")
#include <il\ilu.h> // здесь есть такая строка #pragma comment(lib, "ilu.lib")
// Поэтому вручную писать подключение библиотеки не надо

//...
ilInit(); // Инициализация основной библиотеки
iluInit(); // Инициализация библиотеки утилит
//...

После инициализации можно приступить к загрузке файла.

За загрузку текстуры из файла занимается функция ilLoad. Предполагается, что имя файла хранится в строке FileName типа const char*, тогда нужно сделать преобразования типа т.к. функция принимает файл в виде const ILstring(это относится к старой версии бибилиотеки, которая была на момент написания статьи, для более последующих версий не нужно делать преобразование! ):

//...
// Загрузка файла
ilLoad(FileType, reinterpret_cast<const ILstring>(FileName));
//...

параметр FileType указывает тип загружаемого файла. Для типы файлов определены в виде макросов с помощью директивы #define в заголовочном файле il\il.h, например, для загрузки файлов типа jpg нужно указать FileType IL_JPG, для BMP — IL_BMP, для png — IL_PNG и т.д.

После загрузки файла желательно проверить ошибки в противном случае при потенциальных ошибках программа может свалиться по access violation (что подтверждено моим опытом :)). Код ошибки можно получить с помощью функции ilGetError(), строковое представление ошибки позволяет получить функция iluErrorString():

// Получение кода ошибки
int err = ilGetError();
// Если код не равен нулю ошибка была
if (err != IL_NO_ERROR) {
// Получение строки с ошибкой
const char* strError = iluErrorString(err);
        // Выдаем сообщение об ошибке
        MessageBox(NULL, Message, "Ошибка при загрузке!", MB_OK);
        // выход из программы
        exit(EXIT_FAILURE);
}

При удачной загрузке, можно получить данные об изображении: для получения параметров, используется функция ilGetInteger, параметром которой является название получаемого параметра, оно также определено с помощью директивы define в файле il\il.h

// Ширина изображения
int width = ilGetInteger(IL_IMAGE_WIDTH);
// Высота изображения
int height = ilGetInteger(IL_IMAGE_HEIGHT);
// Число байт на пиксель
int bpp = ilGetInteger(IL_IMAGE_BYTES_PER_PIXEL);

теперь можно получить растровые данные с помощью функции ilGetData():

// Получение растровых данных
unsigned char* data = ilGetData();

Теперь нужно дать знать OpenGL тип хранения данных:

// Тип хранения данных
unsigned int type;
// переопределить тип для OpenGL
switch (bpp) {
case 1:
  type  = GL_RGB8;
  break;
case 3:
  type = GL_RGB;
  break;
case 4:
  type = GL_RGBA;
  break;
}

Дальше следуют стандартные инструкции для загрузки текстуры в видеопамять:

// Индекс текстуры
unsigned int IndexTexture = 0;
glGenTextures(1, &IndexTexture);
glBindTexture(GL_TEXTURE_2D, IndexTexture);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
gluBuild2DMipmaps(GL_TEXTURE_2D, t, width, height, type,
                      GL_UNSIGNED_BYTE, data);

Ну, вот и все. Приятного программирования!

Пример к статье: 20041222.rar (363 кБ. Дополнительно требуются dll от glu и glut)

Для скачки библиотеки следует воспользоваться ссылкой: http://openil.sourceforge.net/

Жду критики и вашего мнения. С уважением Андрей Геец.

#BMP, #JPEG, #OpenGL, #OpenIL, #PNG, #библиотеки

22 декабря 2004 (Обновление: 30 дек 2009)

Комментарии [103]