Математики и кибернетики


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



бет10/20
Дата29.05.2016
өлшемі0.67 Mb.
#100720
түріКонтрольные вопросы
1   ...   6   7   8   9   10   11   12   13   ...   20

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


При наложении текстуры, как уже упоминалось, надо учитывать случай, когда размеры текстуры отличаются от оконных размеров объекта, на который она накладывается. При этом возможно как растяжение, так и сжатие изображения, и то, как будут проводиться эти преобразования, может серьезно повлиять на качество построенного изображения. Для определения положения точки на текстуре используется параметрическая система координат (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



/* 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();

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


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

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

void glTexCoord[1 2 3 4][s i f d] (type coord)

void glTexCoord[1 2 3 4][s i f d]v (type *coord)


Чаще всего используется команды вида glTexCoord2*(type s, type t), задающие текущие координаты текстуры. Понятие текущих координат текстуры аналогично понятиям текущего цвета и текущей нормали, и является атрибутом вершины. Однако даже для куба нахождение соответствующих координат текстуры является довольно трудоемким занятием, поэтому в библиотеке GLU помимо команд, проводящих построение таких примитивов, как сфера, цилиндр и диск, предусмотрено также наложение на них текстур. Для этого достаточно вызвать команду

void gluQuadricTexture (GLUquadricObj* quadObject, GLboolean textureCoords)


с параметром textureCoords равным GL_TRUE, и тогда текущая текстура будет автоматически накладываться на примитив.

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

void glTexGen[i f d] (GLenum coord, GLenum pname,
GLtype param)

void glTexGen[i f d]v (GLenum coord, GLenum pname,


const GLtype *params)
Параметр coord определяет, для какой координаты задается формула, и может принимать значение GL_S,GL_T; pname может быть равен одному из следующих значений:

GL_TEXTURE_GEN_MODE определяет функцию для наложения текстуры.

В этом случае аргумент param принимает значения:



GL_OBJECT_LINEAR значение соответствующей текстурной координаты определяется расстоянием до плоскости, задаваемой с помощью значения pname GL_OBJECT_PLANE (см. ниже). Формула выглядит следующим образом: g=x*xp+y*yp+z*zp+w*wp, где g–соответвующая текстурная координата (s или p), x, y, z, w – координаты соответствующей точки. xp, yp, zp, wp – коэффициенты уравнения плоскости. В формуле используются координаты объекта.

GL_EYE_LINEAR аналогично предыдущему значению, только в формуле используются видовые координаты. Т.е. координаты текстуры объекта в этом случае зависят от положения этого объекта.

GL_SPHERE_MAP позволяет эмулировать отражение от поверхности объекта. Текстура как бы "оборачивается" вокруг объекта. Для данного метода используются видовые координаты и необходимо задание нормалей.

GL_OBJECT_PLANE позволяет задать плоскость, расстояние до которой будет использоваться при генерации координат, если установлен режим GL_OBJECT_LINEAR. В этом случае параметр params является указателем на массив из четырех коэффициентов уравнения плоскости.

GL_EYE_PLANE аналогично предыдущему значению. Позволяет задать плоскость для режима GL_EYE_LINEAR

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

Пример:

Рассмотрим, как можно задать зеркальную текстуру. При таком наложении текстуры изображение будет как бы отражаться от поверхности объекта, вызывая интересный оптический эффект. Для этого сначала надо создать два целочисленных массива коэффициентов s_coeffs и t_coeffs со значениями (1,0,0,1) и (0,1,0,1) соответственно, а затем вызвать команды:



glEnable (GL_TEXTURE_GEN_S);

glTexGeni (GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);

glTexGendv (GL_S, GL_EYE_PLANE, s_coeffs);
и такие же команды для координаты t с соответствующими изменениями.

Программа, использующая наложение текстуры и анимацию, приведена в приложении B.3




Достарыңызбен бөлісу:
1   ...   6   7   8   9   10   11   12   13   ...   20




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет