Первый метод реализуется с помощью команд
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 с соответствующими изменениями.
Создание спецэффектов
В этой главе будут рассмотрены некоторые возможности OpenGL, применимые к созданию впечатляющих спецэффектов, которые могут значительно повысить реалистичность трехмерной сцены.
Туман
Добавление тумана в сцену может повысить реализм, а иногда и скрыть некоторые артефакты, которые появляются, когда в сцене присутствуют отдаленные объекты.
Туман в OpenGL реализуется путем изменения цвета объектов в сцене в зависимости от их глубины (расстояния от точки наблюдения).
Для включения тумана необходимо вызвать команду glEnable(GL_FOG).
Способ вычисления интенсивности тумана можно определить с помощью команд
void glFog[if](enum pname, t param);
void glFog[if]v(enum pname, t params);
Аргумент pname может принимать следующие значения:
GL_FOG_MODE |
в этом случае аргумент param определяет формулу, по которой будет вычисляться интенсивность тумана в точке. |
param может принимать значения
GL_EXP |
Интенсивность вычисляется по формуле f=exp(-d*z) |
GL_EXP2 |
Интенсивность вычисляется по формуле f=exp(-(d*z)) |
GL_LINEAR |
Интенсивность вычисляется по формуле f=e-z/e-s |
В этих формулах z обозначает расстояние от точки, в которой вычисляется интенсивность тумана, до точки наблюдения.
Читать дальше