Главная » Просмотр файлов » Ю.М. Баяковский, А.В. Игнатенко - Начальный курс OpenGL (DOC)

Ю.М. Баяковский, А.В. Игнатенко - Начальный курс OpenGL (DOC) (1124366), страница 8

Файл №1124366 Ю.М. Баяковский, А.В. Игнатенко - Начальный курс OpenGL (DOC) (Ю.М. Баяковский, А.В. Игнатенко - Начальный курс OpenGL (DOC)) 8 страницаЮ.М. Баяковский, А.В. Игнатенко - Начальный курс OpenGL (DOC) (1124366) страница 82019-05-11СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 8)

GL LINEAR —интенсивность вычисляется по формуле / = е — z/e — s, где z — расстояние от вершины, в которой вы­числяется интенсивность тумана, до точки наблюдения.

Коэффициенты d, e, s задаются с помощью следующих зна­чений аргумента pname:

GL_FOG_DENSITY — param определяет коээфициент d

GL_FOG_START —param определяет коэффициент s

GL FOG END —param определяет коэффициент е.

Цвет тумана задается с помощью аргумента pname, равного GL_FOG_COLOR. В этом случае params — указатель на массив из 4-х компонент цвета.

Приведем пример использования этого эффекта:

GLfloat FogColor[4] = {0.5 ,0.5,0.5,1};

glEnable(GL_FOG);

g 1F о g i (GL_FOG_MODE, GL_LEMEAR);

glFogf (GL_FOG_START, 2 0.0);

glFogf (GL_FOG_END, 100.0);

glFogfv (GL_FOG_COLOR, FogColor );

5.5. Контрольные вопросы

  1. Поясните разницу между локальными и бесконечно уда­ленными источниками света.

  2. Для чего служит команда glColorMaterial?

  3. Как задать положение источника света таким образом, что­бы он всегда находился в точке положения наблюдателя?

  4. Как задать фиксированное положение источника света? Можно ли задавать положение источника относительно локальных координат объекта?

5.5. Контрольные вопросы

75

  1. Как задать конусный источник света?

  2. Если в сцене включено освещение, но нет источников света, какой цвет будут иметь объекты?

Глава 6. Текстурирование

Под текстурой будем понимать изображение, которое надо определенным образом нанести на объект, например, для прида­ния иллюзии рельефности поверхности.

Для работы с текстурой следует выполнить следующую по­следовательность действий:

  • выбрать изображение и преобразовать его к нужному фор­мату;

  • передать изображение в OpenGL;

  • определить, как текстура будет наноситься на объект и как она будет с ним взаимодействовать;

  • связать текстуру с объектом.

6.1. Подготовка текстуры

Для использования текстуры необходимо сначала загрузить в память нужное изображение и передать его OpenGL.

77

78

Глава 6. Текстурирование

Считывание графических данных из файла и их преобразо­вание можно проводить вручную. В приложении Б приведен ис­ходный текст функции для загрузки изображения из файла в формате BMP.

Можно также воспользоваться функцией, входящей в состав библиотеки GLAUX (для ее использования надо дополнительно подключить glaux.lib), которая сама проводит необходимые опе­рации. Это функция

AUX_RGBImageRec* auxDIBImageLoad (const char *file)

где file —название файла с расширением *.bmp или *.dib. Функ­ция возвращает указатель на область памяти, где хранятся пре­образованные данные.

При создании образа текстуры в памяти следует учитывать указываемые требования. Во-первых, размеры текстуры, как по горизонтали, так и по вертикали должны представлять собой степени двойки. Это требование накладывается для компактно­го размещения текстуры в текстурной памяти и способствует ее эффективному использованию. Работать только с такими тек­стурами конечно неудобно, поэтому после загрузки их надо пре­образовать. Изменение размеров текстуры можно провести с по­мощью команды

void gluScalelmage (GLenum format , GLint widthin ,

GL heightin , GLenum typein , const void *datain , GLint widthout ,

GLint heightout , GLenum typeout , void *dataout)

В качестве значения параметра format обычно используется значение GL_RGB или GL_RGBA, определяющее формат хране­ния информации. Параметры widthin, heightin, widhtout, heightout определяют размеры входного и выходного изображений, а с по­мощью typein и typeout задается тип элементов массивов, распо-

6.1. Подготовка текстуры

79

ложенных по адресам datain и dataout. Как и обычно, это мо­жет быть тип GL_UNSIGNED_BYTE, GL_SHORT, GL_INT и т.д. Результат своей работы функция заносит в область памяти, на которую указывает параметр dataout.

Во-вторых, надо предусмотреть случай, когда объект после растеризации оказывается по размерам значительно меньше на­носимой на него текстуры. Чем меньше объект, тем меньше должна быть наносимая на него текстура и поэтому вводит­ся понятие уровней детализации текстуры (mipmap). Каждый уровень детализации задает некоторое изображение, которое яв­ляется, как правило, уменьшенной в два раза копией оригинала. Такой подход позволяет улучшить качество нанесения текстуры на объект. Например, для изображения размером 2т х 2п можно построить тах(т, п) + 1 уменьшенных изображений, соответ­ствующих различным уровням детализации.

Эти два этапа создания образа текстуры во внутренней па­мяти OpenGL можно провести с помощью команды

void gluBuild2DMipmaps (GLenum target ,

GLint components , GLint width , GLint height , GLenum format , GLenum type , const void *data)

где параметр target должен быть равен GL_TEXTURE_2D. Па­раметр components определяет количество цветовых компонент текстуры и может принимать следующие основные значения:

GL_LUMINANCE —одна компонента — яркость (текстура будет монохромной);

GL RGB —красный, синий, зеленый;

GL RGBA —красный, синий, зеленый, альфа (см. п. 7.1).

Параметры width, height, data определяют размеры и распо­ложение текстуры соответственно, a format и type имеют анало­гичный смысл, что и в команде gluScalelmageQ.

80

Глава 6. Текстурирование

После выполнения этой команды текстура копируется во внутреннюю память OpenGL, и поэтому память, занимаемую исходным изображением, можно освободить.

В OpenGL допускается использование одномерных текстур, то есть размера 1 х N, однако это всегда надо указывать, за­давая в качестве значения target константу GL_TEXTURE_1D. Одномерные текстуры используются достаточно редко, поэтому не будем останавливаться на этом подробно.

При использовании в сцене нескольких текстур, в OpenGL применяется подход, напоминающий создание списков изображе­ний (так называемые текстурные объекты). Сначала с помощью команды

void glGenTextures (GLsizei n, GLuint* textures)

надо создать п идентификаторов текстур, которые будут запи­саны в массив textures. Перед началом определения свойств оче­редной текстуры следует сделать ее текущей («привязать» тек­стуру), вызвав команду

void glBindTexture (GLenum target , GLuint texture)

где target может принимать значения GL_TEXTURE_1D или GL_TEXTURE_2D, а параметр texture должен быть равен иден­тификатору той текстуры, к которой будут относиться последу­ющие команды. Для того, чтобы в процессе рисования сделать текущей текстуру с некоторым идентификатором, достаточно опять вызвать команду glBindTextureQ с соответствующим зна­чением target и texture. Таким образом, команда glBindTextureQ включает режим создания текстуры с идентификатором texture, если такая текстура еще не создана, либо режим ее использова­ния, то есть делает эту текстуру текущей.

Так как не всякая аппаратура может оперировать текстурами большого размера, целесообразно ограничить размеры текстуры до 256 х 256 или 512 х 512 пикселей. Отметим, что использование небольших текстур повышает эффективность программы.

6.2. Наложение текстуры на объекты

81

6.2. Наложение текстуры на объекты

При наложении текстуры, как уже упоминалось, надо учи­тывать случай, когда размеры текстуры отличаются от оконных размеров объекта, на который она накладывается. При этом воз­можно как растяжение, так и сжатие изображения, и то, как бу­дут проводиться эти преобразования, может серьезно повлиять на качество построенного изображения. Для определения поло­жения точки на текстуре используется параметрическая система координат (s,t), причем значения s и t находятся в отрезке [0,1] (см. рисунок 6.1)

(0,1) (1, 1)

(0,0) (1,0)

Рис. 6.1. Текстурные координаты

Для изменения различных параметров текстуры применяют­ся команды:

void glTexParameter [ i f] (GLenum target , GLenum pname,

GLenum param) void glTexParameter [ i f]v (GLenum target , GLenum pname,

Glenum* params)

Параметр target принимает значения GL_TEXTURE_1D или GL_TEXTURE_2D, pname определяет, какое свойство будем ме­нять, а с помощью param или params устанавливается новое зна­чение. Возможные значения pname:

GL TEXTURE MIN FILTER —параметр param опреде-

82

Глава 6. Текстурирование

ляет функцию, которая будет использоваться для сжатия текстуры. При значении GL_NEAREST будет использовать­ся один (ближайший), а при значении GL_LINEAR — четы­ре ближайших элемента текстуры.

Значение по умолчанию: GL_LINEAR.

GL_TEXTURE_MAG_FILTER —параметр param опреде­ляет функцию, которая будет использоваться для увеличе­ния (растяжения) текстуры. При значении GL_NEAREST будет использоваться один (ближайший), а при значении GL_LINEAR — четыре ближайших элемента текстуры.

Значение по умолчанию: GL_LINEAR.

GL_TEXTURE_WRAP_S —параметр param устанавлива­ет значение координаты s, если оно не входит в отрезок [0,1]. При значении GL_REPEAT целая часть s отбрасы­вается, и в результате изображение размножается по по­верхности. При значении GL_CLAMP используются крае­вые значения (0 или 1), что удобно использовать, если на объект накладывается один образ.

Значение по умолчанию: GL_REPEAT.

GL_TEXTURE_WRAP_T — аналогично предыдущему зна­чению, только для координаты t.

Использование режима GL_NEAREST повышает скорость на­ложения текстуры, однако при этом снижается качество, так как, в отличие от GL_LINEAR, интерполяция не производится.

Для того чтобы определить, как текстура будет взаимодей­ствовать с материалом, из которого сделан объект, используются команды

void glTexEnv [ i f] (GLenum target , GLenum pname,

GLtype param)

void glTexEnv [ i f]v (GLenum target , GLenum pname,

GLtype *params)

6.2. Наложение текстуры на объекты

83

Параметр target должен быть равен GL_TEXTURE_ENV, а в качестве pname рассмотрим только одно значение GL_TEXTURE_ENV_MODE, которое применяется наиболее часто.

Наиболее часто используемые значения параметра param:

GL MODULATE — конечный цвет находится как произведе­ние цвета точки на поверхности и цвета соответствующей ей точки на текстуре.

GL REPLACE —в качестве конечного цвета используется цвет точки на текстуре.

Следующий пример кода демонстрирует общий подход к со­зданию текстур:

/* нужное нам количество текстур */

#define NUM_TEXTURES 10

/* идентификаторы текстур */

int TextureIDs[NUM_TEXTURES] ;

/* образ текстуры */

AUX_RGBImageRec *plmage;

/* 1) получаем идентификаторы текстур */ glGenTextures (NUMJTEXTURES, TexturelDs );

/* 2) выбираем текстуру для модификации параметров */ glBindTexture( TexturelDs [i ]) ; /* 0<=i<NUM_TEXTUBES*/

/* 3) загружаем текстуру.

Размеры текстуры " степень 2 */

pImage=dibImageLoad (" texture .bmp" );

if (Texture!=NULL)

{

/* 4) передаем текстуру OpenGL и задаем параметры*/

84

Глава 6. Текстурирование

/* выравнивание по байту */ glPixelStorei (GLJJNPACK_ ALIGNMENT, 1);

gluBuildMipmaps(GL_TEXTURE_2D,GL_RGB, pImage->sizeX , pImage->sizeY , GL_RGB, GL_UNSIGNED_BYTE, plmage—>data ) ;

g 1T e x P a r a m e t e r f (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, ( float )GL_IJNEAR);

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, ( float )GL_IJNEAR);

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, ( float )GL_REPEAT);

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, ( float )GL_REPEAT);

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, ( float )GL_REPLACE) ;

/* 5) удаляем исходное, изображение.*/ free ( Texture);

Характеристики

Тип файла
Документ
Размер
3,41 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Зачем заказывать выполнение своего задания, если оно уже было выполнено много много раз? Его можно просто купить или даже скачать бесплатно на СтудИзбе. Найдите нужный учебный материал у нас!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6430
Авторов
на СтудИзбе
306
Средний доход
с одного платного файла
Обучение Подробнее