Название: Интерактивная компьютерная графика(А.В. Чернышев,М.Э. Рояк)

Жанр: Информатика

Просмотров: 1275


Задание параметров вывода

void glEnable (GLenum cap) – разрешение режима, заданного сар;

void glDisable (GLenum cap) – запрещение режима, заданного сар.

Некоторые значения

параметра cap

Назначение режима

GL_ALPHA_TEST

Проводится тестирование по цветовому параметру альфа. См. команду glAlphaFunc

GL_BLEND

Разрешается смешивание поступающих значений RGBA цветов со значениями, находящимися в буфере цветов. См. команду gIBIendFunc

GL_CLIP_PLANE i

Разрешается геометрическое отсечение в определенной пользователем плоскости

GL_COLOR_MATERIAL

Для одного или нескольких параметров материала используется значение текущего цвета. См. команду glColorMaterial

GL_DEPTH_TEST

Разрешается выполнение теста на сравнение параметров глубины объектов (z-буфер)

GL_FOG

В цвет объекта после наложения текстуры добавляется цвет тумана. См. команду gIFog

GL_LIGHTi

Включается i-й источник света в общее уравнение оценки освещенности

GL_LIGHTING

В результирующем цвете вершины используются параметры текущей освещенности

 

Для использования освещения сначала надо установить соответствующий режим вызовом команды glEnable(GL_LIGHTNING), а

затем включить нужный источник командой glEnable(GL_LIGHTi).

Текстурирование

Часто возникает потребность накладывать изображение на трехмерные объекты. Для этих целей существуют текстуры.

Для того чтобы наложить текстуру на объект, необходимо:

загрузить графический файл в память;

создать имя-идентификатор текстуры;

сделать его активным;

создать саму текстуру в памяти;

установить параметры текстуры;

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

связать координаты текстуры с объектом.

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

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

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

AUX_RGBImageRec* auxDIBImageLoad (const char *file),

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

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

void gluScaleImage (GLenum format, GLint widthin, GLint 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 задается тип элементов массивов, расположенных по адресам datain и dataout. Это может быть тип GL_UNSIGNED_BYTE, GL_SHORT, GL_INT и т. д. Результат своей работы функция заносит в область памяти, на которую указывает параметр dataout.

Чем меньше объект, тем меньше должна быть наносимая на него текстура и поэтому вводится понятие уровней детализации текстуры (mipmap). Каждый уровень детализации задает некоторое изображение, которое является уменьшенной в два раза копией оригинала.

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

 

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

GL_LUMINANCE  одна компонента – яркость.

GL_RGB        красный, синий, зеленый.

GL_RGBA     все компоненты.

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

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

void glGenTextures (GLsizei n, GLuint* textures)

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

команду

void glBindTexture (GLenum target, GLuint texture),

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

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

Для определения положения точки на текстуре используется параметрическая система координат (s,t), причем значения s и t находятся в отрезке [0,1].

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

команды:

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

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

GL_TEXTURE_MAG_FILTER  аналогичен GL_TEXTURE_MIN_FILTER, только для увеличения (растяжения) текстуры.

GL_TEXTURE_WRAP_S параметр param устанавливает значение координаты s, если оно не входит в отрезок [0,1]. При значении

GL_REPEAT целая часть s отбрасывается, и в результате изображение размножается по поверхности. При значении GL_CLAMP используются краевые значения: 0 или 1, что удобно использовать, если на объект накладывается один образ.

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

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

Параметр target должен быть равен GL_TEXTURE_ENV,

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

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

GL_MODULATE – конечный цвет находится как произведение цвета точки на поверхности и цвета соответствующей ей точки на текстуре;

GL_REPLACE – в качестве цвета используется цвет точки на текстуре.

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