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

НАЛОЖЕНИЕ ТЕКСТУРЫ

Общие положения

Текстура – одномерное, двумерное или трехмерное изображение, которое имеет множество ас­социированных с ним параметров, определяющих, каким образом осуществляется наложение изображения на поверхность.

Существует множество источников текстур. Чаще всего используются растровые изображения и вычисляемые функции.

Текстура задается функцией texture (s) для одномерной (1 D) текстуры, texture (s, t) – двумерной (2 D), texture (s, t, r) – трехмерной (3 D) в так называемом текстурном пространстве, которое принято обозначать параметрами s, t и r. Функция texture генерирует значение цвета или яркости для каждого значения s, t и r в диапазоне от 0 до 1.

Остановимся на изучении наложения текстуры, использующей в качестве источника текстур двумерные растровые изображения.

На рис. 11.1 представлено пространство двумерной текстуры, заданной функцией texture (s, t).

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

На рис. 11.2 приводится иллюстрация этой задачи в целом.

Образец текстуры отображается на ближнюю грань куба. Для грани куба имеется преобразование текстуры в мировые координаты , которое переводит значения текстуры (s, t) в точки (x, y, z) на поверхность грани. Затем осуществляется преобразование  точек трехмерного пространства в точки экрана, поэтому точка (x, y, z) поверхности «видна» на месте пикселя с координатами . Таким образом, можно определить обратное преобразование , которое по пиксельным координатам генерирует текстурные координаты (s, t).

 

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

Поскольку пространство текстуры является плоским, то проще всего наложить текстуру на плоскую поверхность. На рис. 11.3 показано текстурное изображение, отображенное на область треугольника F. Следует указать, как связывать точки текстуры с точками области F. В OpenGL для связи точки текстурного пространства  с каждой вершиной  на грани используется функция glTexCoord2*().

Пример задания текстурных координат glTexCoord2f(0.0, 0.5). Это один пример из большого количества модификаций задания текстурной координаты. Здесь текстурная координата задается двумя параметрами вещественного типа. В общем случае текстурная координата задается функцией:

Пример.

glTexCoord2s(0.5, 1.0) – точка с координатами s = 0.5, t = 1.0, r = 0, q = 1;

glTexCoord3d(0.0, 0.0, 2.0) – точка с координатами s = 0.0, t = 0.0, r = 2.0, q = 1.0;

glTexCoord4f(0.0, 1.0, 0.5, 2.0) – точка с координатами s = 0.0, t = 1.0, r = 0.5, q = 2.0;

GLdouble dvect[3]={0.0, 2.0, 1.0};

glTexCoord3dv(dvect) – точка с координатами s = 0.0, t = 2.0, r = 1.0, q = 1.0.

 

Функция glTexCoord2*(s, t) присваивает текущим текстурным координатам значение (s, t), и они привязываются к последовательно определяемым вершинам. Обычно каждому вызову glVertex*() предшествует вызов функции glTexCoord2*() – каждая вершина получает новую пару текстурных координат. Например, для того, чтобы определить треугольную грань и наложить на нее текстуру, как на рис. 11.3, посылаем в OpenGL три текстурные координаты и три трехмерные точки:

glBegin(GL_TRIANGLES);

glTexCoord2f(0, 1); glVertex3f(1, 1, 1);

glTexCoord2f(0, 0); glVertex3f(0, 0, 0);

glTexCoord2f(1, 0); glVertex3f(1, 1, 0);

glEnd();

 

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

На рис. 11.4 показан общий случай, когда четыре угла текстурного квадрата связываются с четырьмя углами прямоугольника. (На 3 D -грани отмечены текстурные координаты (s, t), связанные с каждым углом.) В данном примере текстура является растровым изображением размером 512/256 пикселей, и она накладывается на прямоугольник с форматным соотношением 512/256, вследствие чего рисунок не искажается. (Отметим, что текстурные координаты s и t по-прежнему изменяются от 0 до 1.)

На рис. 11.5 показано использование текстурных координат, при котором из текстуры делается мозаика – путем повторения этой текстуры. Для этого используются текстурные координаты, лежащие вне интервала [0,1]. Когда в подпрограмме визуализации встречаются значения s и t, лежащие вне единичного квадрата, например s = 2,5, то подпрограмма игнорирует целую часть и использует только дробную часть: 0,5.

По умолчанию OpenGL именно так выкладывает мозаику из текстуры; однако при необходимости вместо этого можно «зафиксировать» данные текстуры.

Таким образом, пара координат (s, t) посылается в графический конвейер вместе с каждой вершиной грани.

 


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: