Наложение текстуры | MetodPro.ru

Реклама на сайте

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


Для чего нужны текстуры

Текстуры являются важным средством создания реалистических изображений. Они позволяют избежать кропотливой работы по прорисовке мелких деталей делающих изображения легко узнаваемыми. Как бы мы не закрашивали поверхность параллелепипеда, он не будет выглядеть сделанным из дерева, пока мы не нанесем характерную для дерева фактуру. Создание изображения кирпичной стены из отдельных примитивов, имитирующих кирпичи, является достаточно трудоемким занятием и получившийся результат будет не очень хорошим, из-за излишней правильности. Гораздо проще наложить текстуру, полученную из фотографии реальной стены на единственный прямоугольник. Подобных примеров можно привести очень много. Текстуры используются при изображении элементов поверхности земли – растительности, гор, водоемов, с их помощью создают иллюзии различных материалов – камня, пластмассы, тканей, на основе текстур создаются различные спецэффекты, такие как отражение одних объектов сцены в других и многое другое.

Что же такое текстуры? Текстуры можно рассматривать как прямоугольные массивы данных, хранящие информацию о цвете. Массивы могут быть одно, двух, трех или четырех мерными. Данные для текстуры могут быть взяты из отсканированного или созданного в графическом редакторе изображения, а так же сгенерированны программно.

Для изучения рассмотрим сначала наложение двумерных текстур, так как оно интуитивно более понятно.  Массив данных часто называют картой текстуры. А элемент массива по аналогии с пикселем называют текселем.

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

Представим координаты текстуры как линейные параметрические функции от

параметров s и t, приведенных к диапазону от 0 до 1.

Тогда левому нижнему углу текстуры будут соответсвовать параметры s=0, t=0

 

Обратное отображение.

 

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);

 

Разрешение и запрещение наложения текстур производится с помощью команд glEnable glDisable, в аргументе которых указывается тип используемой текстуры. Допустимыми значениями являются GL_TEXTURE_1D и GL_TEXTURE_2D.

Команда glTexCoord [1 2 3 4][ s i f d ub us ui][v](s,t,r,q) позволяет связать координаты текстуры с координатами вершин многоугольника. Обратите внимание на то, что данная команда изменяет текущие значения координат текстуры. Все вершины определенные после данной команды будут связываться с текущими значениями, пока они вновь не будут изменены рассматриваемой командой. Другими словами, если вы хотите задать для вершин различные значения координат текстуры, необходимо установить требуемые координаты перед определением вершины.

 

Двумерная текстура определяется командой glTexImage2D(

 GLenum,

 level GLint,

 intrnalFormat GLint,

 width GLsizei,

 height GLsizei,

 border GLint,

 format GLenum,

 type GLenum,

 *texels

);

Где параметр target может принимать одно из двух значений GL_TEXTURE_2D или GL_PROXY_TEXTURE_2D. В случае использования первого значения создается двумерная текстура иначе производится тестирование возможности системы обработать двумерную текстуру с указанными далее характеристиками.

Параметр level задает уровень детализации для создаваемой текстуры. Значения этого параметра задаются отличными от 0, только при задании многоуровневых текстур для MIP-отображения. IntrnalFormat – показывает какую информацию и в каком виде вы хотите хранить в текселе. Допустимыми для использования являются 38 символических констант. Например, GL_RGBA требует хранения величин трех основных цветов и альфа канала, GL_ALFA а константа GL_R3_G3_B2 запрашивает по 3 бита для хранения величит красного и зеленого цветов, а так же 2 бита для хранение голубого цвета. OpenGL не гарантирует совпадения внутреннего формата, с тем форматом который вы запрашиваете, но выбранный системой формат, обеспечит корректное хранение вводимых вами данных. Параметры width и height задают ширину и высоту текстуры. Величины этих параметров должны иметь значения определяемые выражением 2m + 2(border), где m целое положительное число. К нашему сожалению, максимально допустимые размеры текстур не велики (64, 128 или 256 в зависимости от реализации). Параметр *texels задает указатель на массив, хранящий данные для текстуры. Параметр type указывает базовый тип массива, а параметр format говорит о том, в каком формате хранятся данные в массиве. Допустимыми значениями определяются константами GL_ALPHA, GL_RGB, GL_RGBA и другими.

Режимы фильтрации в OpenGL задаются командой

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

 где параметр target определяет тип используемой текстуры GL_TEXTURE_1D, GL_TEXTURE_2D, GL_TEXTURE_3D. Параметр pname определяет, какой из фильтров мы задаем, используемый при уменьшении - GL_TEXTURE_MIN_FILTER или применяемый при увеличении текстуры -GL_TEXTURE_MAG_FILTER. Параметр парам определяет конкретный метод фильтрации.

 При увеличении допустимы следующие константы: GL_NEAREST – при фильтрации выбирается тексель, расположенный ближе всего к отображению центра пикселя; GL_LINEAR - при фильтрации используется средневзвешенное значение четырех текселей лежащих вокруг отображения центра пикселя. При увеличении всегда используется текстура нулевого уровня, не зависимо от того, определено MIP-отображение или нет.

При уменьшении также используются рассмотренные методы фильтрации. Кроме того если полностью определено MIP-отображение, то можно использовать дополнительные фильтры: GL_NEAREST_MIPMAP_NEAREST – фильтрация производится аналогично методу GL_NEAREST, но выбор текселя производится не на нулевом уровне, а на уровне выбранном системой исходя из размеров текстурируемого объекта;

GL_LINEAR_MIPMAP_NEAREST – фильтрация производится аналогично методу GL_LINEAR, но выбор текселя производится не на нулевом уровне, а на уровне выбранном системой исходя из размеров текстурируемого объекта;

GL_NEAREST_MIPMAP_LINEAR – при данном методе выбирается ближайший тексель в двух картах, заданных MIP-отображением, а результирующее значение находится линейной интерполяцией;

GL_LINEAR_MIPMAP_LINEAR – метод фильтрации требующий наибольших вычислительных затрат, но дающий самое высокое качество. На двух картах производится линейная интерполяция по методу GL_LINEAR, а результирующее значение получается линейной интерполяцией между значениями, полученными для каждой из двух карт. Обратите внимание, последние два метода смягчат резкую смену изображений при переходе с одной карты на другую.

Этой же командой можно определять поведение текстуры при выходе параметра за диапазон [0..1]. Задав значение pname одной из констант: GL_TEXTURE_WRAP_S, GL_TEXTURE_WRAP_T или GL_TEXTURE_WRAP_R, мы выбираем поведение какого параметра текстуры будет определяться. Для рaram допустимы следующие символические константы: GL_CLAMP (фиксация) – при выходе из диапазона значение соответствующего параметра заменяется граничным значением. Если параметр текстуры превысил единицу его значение заменяется на единицу, если параметр меньше нуля он заменяется на 0. Это приводит к тому, что текстурировании пикселей изображения, для которых параметры текстуры выходят из указанного диапазона используются граничные пиксели текстуры;

GL_REPEAT (повторение) – при выходе из диапазона, указанный параметр, нормируется (отбрасывается целая часть), что приводит к повторению текстуры.

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

 GlTexEnv[i, f][v](target GLenum, pname GLenum, params).

Параметр target должен быть константой GL_TEXTURE_ENV. Параметр pname указывает на то, определяем мы функцию (режим) текстурирования - GL_TEXTURE_ENV_MODE или дополнительный цвет - GL_TEXTURE_ENV_COLOR, использующийся в режиме смешивания (только для векторной версии команды). В первом случае params может принимать следующие значения: GL_REPLACE, GL_MODULATE, GL_DECAL и GL_BLEND, устанавливающие соответствующие функции текстурирования. При задании дополнительного цвета params содержит указатель на массив, определяющий R-,G-,B-, и A-компоненты.

Остановимся подробнее на функциях текстурирования. Константа GL_REPLACE устанавливает замещающую функцию, которая проводит простую замену цвета объекта на цвет текстуры.

Обратите внимание, что работа всех функций зависит от внутреннего формата данных текстуры (смотри параметр IntrnalFormat в команде glTexImage).

Так, при замещении, если внутренний формат текстуры определен как GL_RGB, произойдет замещение R-,G-, и B-компонент, а значение альфа канала останется неизменным. В текстуре не хранится информация о альфа канале. И наоборот если внутренний формат текстуры GL_ALPHA, то произойдет замещение только значений альфа канала, так как в текстуре нет информации о цвете.

 

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

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

glBindTexture(target GLenum, textureName GLuint). Параметр target определяет тип текстуры, допустимые значения задаются константами GL_TEXTURE_1D, GL_TEXTURE_2D, GL_TEXTURE_3D. Аргумент textureName определяет имя текстурного объекта. В качестве имени текстуры может служить целое число. Во избежание повторения имен реализована специальная процедура glGenTextures, генерирующая список не занятых имен. Аргументы процедуры указывают требуемое количество имен и массив, в котором сгенерированные имена будут размещены.

Обратите внимание на то, что вызов процедуры glBindTexture с одинаковыми параметрами может иметь различный смысл. При первом вызове команды происходит создание текстурного объекта выбранного типа с указанным именем. Повторный вызов процедуры связывания, для объекта с тем же именем, устанавливает выбранный текстурный объект текущим. После этого связанная с данным объектом текстура будет использоваться для текстурирования выводимых объектов. Вызов процедуры со значением параметра textureName равным 0, устанавливает текущей текстурный объект, используемый библиотекой по умолчанию (этот объект используется в том случае когда пользователь не выполняет явного создания текстурных объектов).

 

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

Включение (выключение) автоматической генерации координат текстуры производится командой glEnable (glDisable), в аргументе которой указывается параметр текстуры для которого разрешается генерация. Допустимыми значениями являются с аргументами GL_TEXTURE_GEN_S, GL_TEXTURE_GEN_T, GL_TEXTURE_GEN_R, GL_TEXTURE_GEN_Q.

Способы расчета задаются командой glTexGen[d f i][v](coord GLenum, pname GLenum, param GLdouble). Первый аргумент команды определяет координату текстуры для которой проводится определение, допустимые значения GL_S, GL_T, GL_R, или GL_Q. Параметр pname указывает какой параметр генерации задается. Если значение данного параметра равно GL_TEXTURE_GEN_MODE то данная команда будет устанавливать режим генерации текстуры, в противном случае (значения параметра GL_OBJECT_PLANE или GL_EYE_PLANE) будут задаваться свойства выбранного режима. Сначала рассмотрим допустимые режимы расчета координат текстуры, их три:

GL_OBJECT_LINEAR – в этом режиме расчет координат текстуры производится исходя из координат вершин в координатной системе объекта. То есть тех значений которые вы определили при выводе объекта, между операторными скобками glBegin – glEnd. Для получения значений координат текстуры для внутренних точек объекта используется линейная интерполяция. Координаты текстуры рассчитываются по формуле g = p1xo + p2yo+p3zo+p4wo где xo,yo,zo,wo – координаты вершины, а p1, p2, p3, p4  - коэффициенты, механизм назначения которых мы рассмотрим немного ниже. По умолчанию для ……….

Использование данного режима приводит к тому, то всем преобразованиям, накапливаемым в матрице преобразования модели, подвергаются как объекты так и связанные с ними параметры текстуры. Например, если мы подвергнем объект преобразованию поворота, то наложенная на него текстура повернется вместе с объектом.

В геометрической интерпретации приведенную формулу можно рассматривать как уравнение плоскости, тогда значение координаты текстуры определиться как расстояние от плоскости до вершины. С другой точки зрения, можно рассмотреть данную формулу как функцию, отображающую координаты вершины в координату текстуры. Коэффициенты p1, p2, p3 рассматривать как масштабирующие множители, а коэффициент p4 – будет определять величину сдвига (переноса), так как в однородных координатах  обычно w = 1. Предположим, что мы накладывает текстуру на квадрат с единичной стороной, центром которого является начало координат. Для упрощения примера расположим его параллельно плоскости z=0. , GL_EYE_LINEAR, or GL_SPHERE_MAP.



Методические пособия

  • Системы автоматизированного проектирования
  • Социология молодёжи
  • Общая социология
  • Криптография
  • Проектирование трансляторов
  • Компьютерная графика
  • Моделирование систем
  • Информационная безопасность
  • Теория вычислительных процессов
  • Логические основы искусственного интелекта
  • Проектирование распределённых информационных систем