ПРИМЕЧАНИЕ
Так как не всякая аппаратура может оперировать текстурами большого размера, целесообразно ограничить размеры текстуры до 256×256 пикселей. Использование небольших текстур повышает эффективность приложения.
Параметры текстуры
При наложении текстуры, как уже упоминалось, надо учитывать случай, когда размеры текстуры отличаются от размеров объекта, на который она накладывается. При этом возможно как растяжение, так и сжатие изображения, и то, как будут проводиться эти преобразования может серьезно повлиять на качество построенного изображения. Для определения положения точки на текстуре используется параметрическая система координат (s, t), причем значения s и t находятся в отрезке [0, 1]. Для изменения различных параметров текстуры применяются команды:
void glTexParameter[i f](GLenum target, GLenum pname, GLenum param)
void glTexParameter[i f]v(GLenum target, GLenum pname, GLenum *params)
При этом target имеет аналогичный смысл, что и раньше, 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 |
в качестве конечного цвета используется цвет точки на текстуре. |
GL_BLEND |
конечный цвет находится как сумма цвета точки на поверхности и цвета соответствующей ей точки на текстуре с учетом их яркости. |
Общий подход к созданию текстур:
/* нужное нам количество текстур */
#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();
Координаты текстуры
Перед нанесением текстуры на объект осталось установить соответствие между точками на поверхности объекта и на самой текстуре. Задавать это соответствие можно двумя методами: отдельно для каждой вершины или сразу для всех вершин, задав параметры специальной функции отображения.
Читать дальше