Elite Games - Свобода среди звезд!

Уроки для программистов - Текстуры

Глава 6. Текстуры

Собственно, говорить что такое текстуры не имеет особого смысла. Начнем сразу с того, как же их вкрутить в наш движок.

Создадим класс JLTexture.

Внимание – этот класс не наследник нашего JLSceneObj, это вообще другой класс и хранится он будет отдельно!


JLTexture=class;
PJLTexture=^JLTexture;

JLTexture=class
tex:cardinal;
IdName:string;
constructor create;
destructor destroy; override;

procedure LoadFromFile(const FName:string);
procedure Bind;
procedure Setup;

procedure Assign(const T:PJLTexture);
end;


Вот тут встает проблема с загрузкой текстур с жесткого диска. Раньше я использовал простые процедуры – загрузчики, выковырянные из примеров по OpenGL. Но поддержка форматов и скорость загрузки – большая проблема для таких случаев.
Поэтому сейчас я использую DevIL – бесплатную библиотеку с огромной функциональностью. Что будете использовать вы – решать вам.

Как видите, исходного кода все меньше и меньше, это сделано для того чтоб вы писали остальное сами, а не копировали, не обдумывая «что оно делает».

Но я опишу команды OpenGL, связанные с текстурами.


glGenTextures(n,@ tex[0]);

генерирует n текстур, и указатель на них помещает в массив tex. На самом деле в памяти ничего не освобождает, и вы можете обойтись без этой команды, но это нежелательно.


glDeleteTextures(n,@ tex[0]);

то же самое, но освобождает «места» под текстуру. В памяти тоже ничего не освобождает(хотя, кто знает, что будет в следующих версиях OpenGL).

Как вы догадались, эти процедуры нужно вызывать в create и free соответственно.


glBindTexture(target, tex[4]);

target в большинстве случаев = GL_TEXTURE_2D.
tex[4] – указатель на текстуру.
Эта процедура делает текстуру tex[4] текущей. Все что нарисовано потом будет «покрыто» этой текстурой.

Загрузка текстур. Тут надо сделать следующее.

-Загрузить текстуру из файла.
-Узнать её формат и размеры
-И вот это:


glBindTexture(GL_TEXTURE_2D, Tex); // текущей делаем


-А потом построить Мип-Мап уровни(или не строить, а использовать glTexImage2D).


gluBuild2DMipmaps(GL_TEXTURE_2D, col, width, height, format, GL_UNSIGNED_BYTE, data);

col – количество компонентов цвета. RGB – 3, RGBA – 4.
width и height – это размеры.
format – формат, в котором идут пиксели (GL_RGB,GL_RGB8,GL_RGBA и еще много разных).
data – указатель на пиксели.
Теперь про настройки.

glTexParameteri- задает их.

Их вообще много, но мы поговорим об фильтрации.

Билинейная фильтрация – наш минимум. При ней видны переходы мип-мап уровней. Посмотрите старенькие игрушки — там четко видна полоса их перехода.

Трилинейная — при ней перехода не видно, но есть сильное смазываение, если смотреть на плоскость с текстурой под углом.

Анизотропная — самая совершенная фильтрация, у неё смазывание меньше заметно (смотря от уровня анизотропии).

Если вы хотите, чтоб у вас она была, то достаточно ввести парочку строк.

нужно загрузить это расширение:


GL_EXT_texture_filter_anisotropic


узнать максимальный уровень фильтрации:


glGetIntegerv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT,@ JL_ANISOTROPY_LEVEL);



И там где вы задаете фильтрацию
(в данном случае трилинейную)


glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);


нужно дописать:


if JL_USE_ANISOTROPY then
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAX_ANISOTROPY_EXT, JL_ANISOTROPY_LEVEL);

JL_ANISOTROPY_LEVEL – в данном случае будет максимально возможным на данной видеокарте, т.к. сейчас в этой переменной находится максимальная степень, взятая с помощью glGetIntegerv.

Вот и все о текстурах.
Jurec
К началу раздела | Наверх страницы Сообщить об ошибке
Уроки для программистов - Текстуры
Все документы раздела: Для тех, кто хочет писать игры | Движок на OpenGL | Создание игр в Game Maker | Bump mapping | Использование Direct Input | XNA framework |


Дизайн Elite Games V5 beta.18
EGM Elite Games Manager v5.17 02.05.2010