
- •Глава 1. Основы OpenGl 8
- •Введение
- •ОсновыOpenGl
- •Основные возможности
- •ИнтерфейсOpenGl
- •АрхитектураOpenGl
- •Синтаксис команд
- •Пример приложения
- •Контрольные вопросы:
- •Рисование геометрических объектов
- •Процесс обновления изображения
- •Вершины и примитивы
- •Положение вершины в пространстве
- •Цвет вершины
- •Нормаль
- •Операторные скобкиglBegin/glEnd
- •Дисплейные списки
- •Массивы вершин
- •Контрольные вопросы
- •Преобразования объектов
- •Работа с матрицами
- •Модельно-Видовые преобразования
- •Проекции
- •Область вывода
- •Контрольные вопросы
- •Материалы и освещение
- •Модель освещения
- •Спецификация материалов
- •Описание источников света
- •Создание эффекта тумана
- •Контрольные вопросы
- •Текстурирование
- •Подготовка текстуры
- •Наложение текстуры на объекты
- •Текстурные координаты
- •Контрольные вопросы
- •Операции с пикселями
- •Смешивание изображений. Прозрачность
- •Буфер-накопитель
- •Буфер маски
- •Управление растеризацией
- •Приемы работы сOpenGl
- •Устранение ступенчатости
- •Построение теней
- •Зеркальные отражения
- •Оптимизация программ
- •Организация приложения
- •Высокоуровневая оптимизация
- •Низкоуровневая оптимизация
- •Оптимизация вызовов OpenGl
- •Передача данных в OpenGl
- •Преобразования
- •Растеризация
- •Текстурирование
- •Очистка буферов
- •СтруктураGlut-приложения
- •Примитивы библиотекGlUиGlut
- •Настройка приложенийOpenGl
- •Демонстрационные программы
- •Пример 1: Простое glut-приложение
- •Пример 2: Модель освещения OpenGl
- •Пример 3: Текстурирование
- •Примеры практических заданий
- •Виртуальные часы
- •Интерактивный ландшафт
- •Литература
- •Предметный указатель
Наложение текстуры на объекты
При наложении текстуры, как уже упоминалось, надо учитывать случай, когда размеры текстуры отличаются от оконных размеров объекта, на который она накладывается. При этом возможно как растяжение, так и сжатие изображения, и то, как будут проводиться эти преобразования, может серьезно повлиять на качество построенного изображения. Для определения положения точки на текстуре используется параметрическая система координат (s,t), причем значения s и t находятся в отрезке [0,1] (см. рисунок)
Рис. 8 Текстурные
координаты
Для изменения различных параметров текстуры применяются команды:
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определяет функцию, которая будет использоваться для сжатия текстуры. При значении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)
Параметр targetдолжен быть равенGL_TEXTURE_ENV, а в качествеpnameрассмотрим только одно значениеGL_TEXTURE_ENV_MODE, которое наиболее часто применяется.
Наиболее часто используемые значения параметра param:
GL_MODULATE конечный цвет находится как произведение цвета точки на поверхности и цвета соответствующей ей точки на текстуре.
GL_REPLACE в качестве конечного цвета используется цвет точки на текстуре.
Следующая программа демонстрирует общий подход к созданию текстур:
/* нужное нам количество текстур */
#define NUM_TEXTURES 10
/* идентификаторы текстур */
int TextureIDs[NUM_TEXTURES];
/* образ текстуры */
AUX_RGBImageRec *pImage;
…
/* 1) получаем идентификаторы текстур */
glGenTextures(NUM_TEXTURES,TextureIDs);
/* 2) выбираем текстуру для модификации параметров */
glBindTexture(TextureIDs[i]); /* 0<=i<NUM_TEXTURES*/
/* 3) загружаем текстуру. Размеры текстуры – степень 2 */
pImage=dibImageLoad("texture.bmp");
if (Texture!=NULL)
{
/* 4) передаем текстуру OpenGL и задаем параметры*/
/* выравнивание по байту */
glPixelStorei(GL_UNPACK_ALIGNMENT,1);
gluBuildMipmaps(GL_TEXTURE_2D,GL_RGB, pImage->sizeX, pImage->sizeY, GL_RGB, GL_UNSIGNED_BYTE, pImage->data);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, (float)GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, (float)GL_LINEAR);
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);
}else Error();