![]() |
|
![]() |
![]() |
Новости | Конференция | Чат | База данных | Творчество | Сообщество | О сайте | English |
![]() |
Помощь сайту |
![]() |
![]() |
![]() |
![]() |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Глава 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. Вот и все о текстурах.
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() |
![]() |
![]() |
![]() |
Дизайн Elite Games V5 beta.18 EGM Elite Games Manager v5.17 02.05.2010 |
![]() |