Руководство по работе с графической библиотекой OpenGL. Руководство разработано с учетом опыта чтения курса Компьютерная графика
Скачать 0.66 Mb.
|
GL TEXTURE MIN FILTER —параметр param опреде- 82 Глава 6. Текстурирование ляет функцию, которая будет использоваться для сжатия текстуры. При значении 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) 6.2. Наложение текстуры на объекты 83 Параметр target должен быть равен GL_TEXTURE_ENV, а в качестве pname рассмотрим только одно значение GL_TEXTURE_ENV_MODE, которое применяется наиболее часто. Наиболее часто используемые значения параметра param: GL MODULATE — конечный цвет находится как произведение цвета точки на поверхности и цвета соответствующей ей точки на текстуре. GL REPLACE —в качестве конечного цвета используется цвет точки на текстуре. Следующий пример кода демонстрирует общий подход к созданию текстур: /* нужное нам количество текстур */ #define NUM_TEXTURES 10 /* идентификаторы текстур */ int TextureIDs[NUM_TEXTURES] ; /* образ текстуры */ AUX_RGBImageRec *plmage; /* 1) получаем идентификаторы текстур */ glGenTextures (NUMJTEXTURES, TexturelDs ); /* 2) выбираем текстуру для модификации параметров */ glBindTexture( TexturelDs [i ]) ; /* 0<=i /* 3) загружаем текстуру. Размеры текстуры " степень 2 */ pImage=dibImageLoad (" texture .bmp" ); if (Texture!=NULL) { /* 4) передаем текстуру OpenGL и задаем параметры*/ 84 Глава 6. Текстурирование /* выравнивание по байту */ glPixelStorei (GLJJNPACK_ ALIGNMENT, 1); gluBuildMipmaps(GL_TEXTURE_2D,GL_RGB, pImage->sizeX , pImage->sizeY , GL_RGB, GL_UNSIGNED_BYTE, plmage—>data ) ; g 1T e x P a r a m e t e r f (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, ( float )GL_IJNEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, ( float )GL_IJNEAR); 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 () ; 6.3. Текстурные координаты Перед нанесением текстуры на объект необходимо установить соответствие между точками на поверхности объекта и на самой текстуре. Задавать это соответствие можно двумя методами: отдельно для каждой вершины или сразу для всех вершин, задав 6.3. Текстурные координаты 85 параметры специальной функции отображения. Первый метод реализуется с помощью команд void glTexCoord[l 2 3 4][s i f d] (type coord) void glTexCoord[l 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 —значение соответствующей текстурной координаты определяется расстоянием до 86 Глава 6. Текстурирование плоскости, задаваемой с помощью значения pname GL_OBJECT_PLANE (см. ниже). Формула выглядит следующим образом: g = x*Xp + y*yp + z*Zp + w*wp где д — соответствующая текстурная координата (s или р), x,y,z,w — координаты соответствующей точки. xp,yp,Zp,Wp — коэффициенты уравнения плоскости. В формуле используются координаты объекта. GL_EYE_LINEAR — аналогично GL_OBJECT_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. Программа, использующая наложение текстуры и анимацию, приведена в приложении Б. 6.4- Контрольные вопросы 87 6.4. Контрольные вопросы Что такое текстура и для чего используются текстуры? Что такое текстурные координаты и как задать их для объекта? Какой метод взаимодействия с материалом нужно использовать, если текстура представляет собой картину, висящую на стене (GL_MODULATE, GL_REPLACE)? Перечислите известные вам методы генерации текстурных координат в OpenGL. Для чего используются уровни детализации текстуры (mip-mapping)? Что такое режимы фильтрации текстуры и как задать их в OpenGL? Глава 7. Операции с пикселями После проведения всех операций по преобразованию координат вершин, вычисления цвета и т.п., OpenGL переходит к этапу растеризации, на котором происходит растеризация всех примитивов, наложение текстуры, наложение эффекта тумана. Для каждого примитива результатом этого процесса является занимаемая им в буфере кадра область, каждому пикселю этой области приписывается цвет и значение глубины. OpenGL использует эту информацию, чтобы записать обновленные данные в буфер кадра. Для этого OpenGL имеет не только отдельный конвейер обработки пикселей, но и несколько дополнительных буферов различного назначения. Это позволяет программисту гибко контролировать процесс визуализации на самом низком уровне. Графическая библиотека OpenGL поддерживает работу со следующими буферами: несколько буферов цвета; буфер глубины; буфер-накопитель (аккумулятор); 89 |