Лабораторна робота № 7. Текстури: режими фільтрації, режими взаємодії текстури з|із| об'єктом, що накладається, автоматична генерація координат текстур.
Мета|ціль| роботи.
Дати уявлення про можливості|спроможності| накладення текстур| на поверхні об'єктів засобами|коштами| OPENGL|.
Необхідні теоретичні відомості.
Текстура – одновимірне, двомірне або тривимірне зображення, яке має безліч асоційованих з ним параметрів, що визначають яким чином проводитиметься накладення зображення на поверхню. Простіше кажучи, текстура – це зображення, що накладається на поверхню. З фізичної точки зору текстура - масив даних, наприклад колірних, світлових або колірних і альфа. Кожен елемент цього масиву називається текселем. Координати текстур – координати текселя, що призначається вершині.
Загальноприйняті імена для координат текстур – s, t, r, q.
Для використання текстур| необхідно виконати наступну|таку| послідовність дій:*|
1. Підготовка зображення для використання в текстурі
Завантаження|загрузка| зображення з|із| файлу.
2. Створення|створіння| текстури
Генерація унікального імені текстури*|
Виконання операції первинного зв’язування*|
Пов'язання|зв'язування| зображення з текстурою*|
Установка режимів фільтрації текстури
Установка параметрів взаємодії об'єкту, з|із| текстурою, що накладається.
Установка режиму мозаїчного накладення текстури.
Автоматична генерація координат текстур, ефект віддзеркалення|відображення|.
3. Використання текстури
Вибір текстури для використання (вторинне|повторне| скріплення|зв'язування|).
Узгодження геометричних і текстур координат
Створення|створіння| ефекту віддзеркалення|відображення| за допомогою текстур|.
* - Зірочкою позначені обов'язкові пункти.
Підготовка зображення для використання в текстурі.
Перший етап виконується при ініціалізації OPENGL|.
OPENGL| має свій формат зберігання зображень. Підготовчий етап полягає в тому, що б перетворити зображення у формат OPENGL|. У бібліотеці GLAUX| є|наявний| функція, яка прочитує зображення з|із| DIB| або BMP| файлу і автоматично перетворює його до формату OPENGL|.
AUX_RGBImageRec*| auxDIBImageLoad|(strFile|);
Функція повертає покажчик на структуру типу|типу| AUX_RGBImageRec|, яка зберігає саме зображення і його основні параметри – ширину і висоту.
struct| AUX_RGBImageRec|
{unsigned char *data; // зображення GLint sizeX; // ширина зображення GLint sizeY; // висота зображення};
Передаване значення – шлях|колія| до файлу із|із| зображенням.
Приклад|зразок| використання функції auxDIBImageLoad| – завантаження|загрузка| зображення з|із| файлу sky|.bmp у об'єкт структури ImageSky|.
AUX_RGBImageRec| *ImageSky;ImageSky = auxDIBImageLoad|(“sky|.bmp”);
Створення|створіння| текстури
Цей етап, як і підготовка зображення, зазвичай|звично| виконується під час ініціалізації OPENGL|.
Для того, що б вирішити текстурування| використовується функція
glEnable|(GL_TEXTURE_2D|);
Єдиний параметр цієї функції визначає тип текстур|, використовуваних в програмі. Зазвичай|звично| цей параметр приймає значення GL_TEXTURE_2D|
1) Генерація унікального імені текстури
Кожна текстура, яка використовується в OPENGL| повинна мати своє унікальне ім'я – ідентифікатор типа|типу| GLuint|. Для автоматичної генерації цього ідентифікатора служить функція
void| glGenTextures|(GLsizei| n, GLLuint| *textures);
Передавані параметры:| n кількість ідентифікаторівtextures|, що генеруються масив, куди будуть записані cгенеровані| ідентифікатори
Приклад|зразок| генерації унікальних ідентифікаторів в першому випадку для однієї текстури, в другому – для п'яти текстур|.
GLuint| SingleTex|;
Gluint| ArrayTex|[5];
glGenTextures(1 &SingleTex);// Генерація одного ідентифікатора
glGenTextures(5 &ArrayTex); // Генерація п'яти ідентифікаторів
2) Первинне скріплення|зв'язування|
Перш ніж задати конкретне зображення текстурі необхідно провести|виробляти| операцію первинного скріплення|зв'язування|. При цьому створюється новий об'єкт текстури, і передане|передавати| ім'я текстури асоціюється з|із| ним. Реалізується це за допомогою виклику функції
void| glBindTexture| (GLenum| target|, GLuint| texture|)
target| задає цільовий об'єкт з|із| яким зв'язується текстура, може набувати значень
GL_TEXTURE_1D|, GL_TEXTURE_2D|, GL_TEXTURE_3D|.
texture| ідентифікатор текстури
Приклад|зразок| первинного скріплення|зв'язування| створює об'єкт текстури і зіставляє|співставляє| йому ідентифікатор SingleTex|.
glBindTexture|(GL_TEXTURE_2D|, SingleTex|);
3) Пов'язання|зв'язування| зображення з текстурою
Конкретне зображенням асоціює з текстурою за допомогою функції glTexImage2D.
Для зображення, підготовленого функцією auxDIBImageLoad необхідне як параметр target використовувати значення GL_TEXTURE_2D. Зображення, які ви використовуєте повинно мати ширину і висоту кратний ступінь двійки, ширина межі текстури теж має бути ступенем двійки. Якщо ви не використовуєте межу текстури те як параметр border слід вказати 0. Формат кольору пікселя - GL_RGB.
Внутрішній формат – число 3. Кількість рівнів деталізації – можна встановити в 0. Ширина, висота і само зображення визначаються з|із| об'єкту типу|типу| AUX_RGBImageRec|, підготовленого за допомогою функції auxDIBImageLoad|.
void| glTexImage2D|(
GLenum| target| // GL_TEXTURE_2D|
GLint| level| // Рівень деталізації
GLint // Внутрішній формат
GLsizei| width| // ширина зображення
GLsizei| height| // висота зображення
GLint| border| // ширина межі|кордону|
GLenum| format| // формат кольору|цвіту| пікселя
GLenum| type| // тип даних в масиві pixels|
const| GLvoid| *pixels); // покажчик на зображення
Приклад|зразок| Створюємо текстуру з|із| ідентифікатором SingleTex| і зображенням ImageSky|.
glTexImage2D|(GL_TEXTURE_2D|, 0, 3
ImageSky->sizeX|, TypeGL_RGBImage->sizeY|
0, GL_RGB|, GL_UNSIGNED_BYTE|, TypeGL_RGBImage->data|);
4) Режими фільтрації.
При відмінності розмірів текстури і розмірів об'єкту, на який вона накладається, використовуються різні режими фільтрації. Режим без згладжування, лінійна фільтрація, мип-мэп| накладення.
а) Використання режиму без згладжування дозволяє добитися максимальної продуктивності, проте зображення при цьому виглядатиме неприродно. Цей режим рекомендовано застосовувати тільки на дуже слабих машинах.
Для завдання режимів фільтрації використовується функція glTexParameteri
void glTexParameteri(GLenum target, GLenum, GLint HYPERLINK "" Ошибка! Недопустимый объект гиперссылки.);
Перший параметр визначає тип текстури (у нашому випадку GL_TEXTURE_2D|)
Другий параметр - визначає встановлювані параметри
При установці параметрів зменшуючого фільтру (розмір текстури більше розміру поверхні на яку вона накладається) цей параметр приймає значення GL_TEXTURE_MIN_FILTER,а при установці параметрів збільшуючого фільтру - GL_TEXTURE_MAX_FILTER.
Останній параметр визначає значення параметра pname|
При використанні фільтру без згладжування цей параметр приймає значення GL_NEAREST
Приклад|зразок| завдання|задавання| зменшуючого і збільшуючого фільтру без згладжування
glTexParameteri|(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST|);
glTexParameteri|(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST|);
б) Використання лінійної фільтрації дозволяє помітно поліпшити якість зображення, проте продуктивність при цьому знижується, оскільки цей режим вимагає певних обчислень. У цьому режимі збільшення/зменшення використовується зважена сума масиву текселей 2х2, які знаходяться щонайближче до пікселю, що відображується.
Виклик функції glTexParameteri для установки режиму фільтрації аналогічний режиму без згладжування, за винятком останнього параметра – він набуває значення GL_LINEAR
Приклад|зразок| завдання|задавання| зменшуючого і збільшуючого фільтру лінійній фільтрації
glTexParameteri|(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR|);
glTexParameteri|(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR|);
в) Міп-меп накладення. При використанні цього методу OPENGL створює набір картинок різного розміру (від початкового до розміру в 1х1 тексель). Під час роботи програми автоматично вибирається картинка найбільш відповідного розміру. При використанні цього способу можливе недотримання умови того, що висота і ширина зображення має бути ступенем двійки. Так само існує відмінність в пов'язанні зображення з текстурою (див. «3 Пов'язання зображення з текстурою»). Цей спосіб фільтрації дає якнайкраще зображення, проте є найбільш витратним з погляду продуктивності.
Приклад|зразок| використання скріплення|зв'язування| зображення з|із| текстурою з|із| подальшим|наступним| включенням|приєднанням| режиму фільтрації - мип-мап| накладення.
gluBuild2DMipmaps|(GL_TEXTURE_2D|, 3, TypeGL_RGBImage->sizeX,TypeGL_RGBImage->sizeY|, GL_RGB|, GL_UNSIGNED_BYTE|, TypeGL_RGBImage->data|);
glTexParameteri|(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,| GL_LINEAR_MIPMAP_NEAREST|);
glTexParameteri|(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,| GL_LINEAR_MIPMAP_LINEAR|);
Параметри, передавані у функцію gluBuild2Dmipmaps| аналогічні параметрам передаваним у функцію glTexImage2D|.
5) Установка параметрів взаємодії об'єкту, з|із| текстурою, що накладається.
У OPENGL існує можливість змішувати колір текстури, що накладається, з початковим кольором об'єкту. Для цього необхідно викликати функцію glTexEnv.
void| glTexEnv|(Glenum| target|, Glenum| pname|, GLType| param|);
taget| перший параметр - визначає конфігурацію текстури і повинен бути рівним GL_TEXTURE_ENV|.
pname| - визначає символічне ім'я конфігурації текстури. Має бути рівний GL_TEXTURE_ENV_MODE|.
param| – символічна константа, для якої допустимі значення GL_MODULATE|, GL_DECALL|, GL_BLEND|.
При використанні GL_MODULATE| колір|цвіт| текстури як би зливається з|із| кольором|цвітом| об'єкту, при режимі DECALL|, колір|цвіт| об'єкту, відповідає кольору|цвіту| текстури, що накладається.
Приклад|зразок|. У першому випадку результуючий колір|цвіт| об'єкту складається, з|із| кольору|цвіту| об'єкту і кольору|цвіту| текстури, в другому результуючий колір|цвіт| – колір|цвіт| текстури.
// Злиття квітів
glTexEnvf|(GL_TEXTURE_ENV|, GL_TEXTURE_ENV_MODE|, GL_MODUALTE|);
// Кольори|цвіт| текстури
glTexEnvf|(GL_TEXTURE_ENV|, GL_TEXTURE_ENV_MODE|, GL_DECAL|);
6) Установка режиму мозаїчного(тайлового|) накладення текстури.
Інколи|іноді| виникає необхідність в повторенні текстури, наприклад при отрисовке| цегельної|цегляної| стіни. OPENGL| надає таку можливість|спроможність|, достатньо|досить| тільки|лише| виконати дві умови:
а) Вирішити режим повторення текстури. Режим повторення задається окремо для вертикальної і для горизонтальної осі:
GlTexParametri|(GL_TEXTURE_2D|, GL_TEXTURE_WRAP_S|, GL_REPEAT|);
GlTexParametri|(GL_TEXTURE_2D|, GL_TEXTURE_WRAP_T|, GL_REPEAT|);
Останній параметр визначає режим накладення текстури при значенні GL_REPEAT| текстура буде повторяться, при накладенні на об'єкт. Якщо замість останнього параметра – GL_REPEAT| використовувати GL_CLAMP|, текстура розтягуватиметься при накладенні на поверхню, що накладається.При
б) Задати координати текстури > 1.0, наприклад 4.0 в цьому випадку текстура буде повторена на поверхні, що накладається, 4 рази.
7) Автоматична генерація координат текстур, ефект віддзеркалення|відображення|.
За допомогою текстурування в OPENGL| можливо реалізувати ефект віддзеркалення|відображення| навколишніх|довколишніх| предметів від блискучих|лискучих| поверхонь. Нижче наведений приклад завдання|задавання| режиму дзеркального віддзеркалення|відображення|. У двох строчках визначаються параметри генерації координат текстур – в даному випадку координати текстур обчислюються|обчисляють| в сфері навколо|навкруг| позиції образу|зображення|. При використанні автоматичної генерації координат текстур необхідно як фільтр використовувати мип-мапы|.
gluBuild2DMipmaps|(GL_TEXTURE_2D|, 3, TypeGL_RGBImage->sizeX|
TypeGL_RGBImage->sizeY|, GL_RGB|, GL_UNSIGNED_BYTE,TypeGL_RGBImage->data|);
glTexGeni|(GL_S|, GL_TEXTURE_GEN_MODE|, GL_SPHERE_MAP|);
glTexGeni|(GL_T|, GL_TEXTURE_GEN_MODE|, GL_SPHERE_MAP|);
Використання текстури.
Цей етап виконується безпосередньо у функції промальовування сцени.
1) Вибір текстури для використання (вторинне|повторне| скріплення|зв'язування|)
Для використання текстури в програмі її треба зробити активною цей процес і називається вторинним|повторним| скріпленням|зв'язуванням|. Вторинне|повторне| скріплення|зв'язування|, як і первинне, виконується за допомогою функції
void| glBindTexture| (GLenum| target|, GLuint| textureName|);
target| визначає типа|тип| текстури (GL_TEXTURE_1D|, GL_TEXTURE_2D|, GL_TEXTURE_3D|). Цей параметр повинен збігатися з|із| тим, який був при операції первинного скріплення|зв'язування|.
textureName ідентифікатор текстури.
Приклад|зразок| вторинного|повторного| скріплення|зв'язування| – робить|чинить| активною текстуру з|із| идентификаторм| SingleTex|.
glBindTexture|(GL_TEXTURE_2D|, SingleTex|);
2) Узгодження геометричних і текстур координат
При промальовуванні об'єкту, на який накладається текстура, необхідно погоджувати|узгоджувати| координати текстур з|із| геометричними. Наприклад при накладенні текстури на прямокутний об'єкт ви повинні відображати|відображати| правий верхній кут|ріг| текстури в правий верхній кут|ріг| об'єкту, правий нижній кут|ріг| текстури в правий нижній кут|ріг| об'єкту і так далі
Координати текстур є часткою даних, пов'язаних з вершинами багатокутника. Для установки координат текстур використовується функція glTexCoord2f(GLfloat s, GLLfloat t);
s - визначає горизонтальну координату текстури
t - визначає вертикальну текстурну| координату
Система координат текстур має наступний|слідуючий| вигляд|вид|:
s
t
0.0
0.0
1.0
1.0
0.5
0.5
Приклад|зразок| накладення текстури з|із| розтягуванням на прямокутний об'єкт.
3.0
5.0
-1.0
-1.0
y
x
z
Вид объекта после наложения текстуры
glBegin|(GL_QUADS|);
glTexCoord2f|(0.0, 0.0); glVertex3f|(-1.,-1., 0.); //лівий нижній кут|ріг|
glTexCoord2f|(1.0, 0.0); glVertex3f|( 5.,-1., 0.); //правий нижній кут|ріг|
glTexCoord2f|(1.0, 1.0); glVertex3f|( 5., 3., 0.); //правий верхній кут|ріг|
glTexCoord2f|(0.0, 1.0); glVertex3f|(-1., 3., 0.); //лівий верхній кут|ріг|
glEnd|();
Приклад|зразок| накладення текстури на трикутник.
EMBED Photoshop.Image.7 \s
Вид об’єкта після накладання текстури
У даному прикладі|зразку| використовується тільки|лише| ліва нижня частка|частина| текстури
y
x
z
2.0
-2.0
-1.0
3.0
glBegin(GL_TRIANGLES);
glTexCoord2f|(0.0, 0.0); glVertex3f|(-2.,-1., 0.); //ліва нижня вершина
glTexCoord2f|(0.5, 0.0); glVertex3f|( 2.,-1., 0.); //права нижня вершина
glTexCoord2f|(0.25, 0.5); glVertex3f|( 0., 3., 0.); //верхня вершина
glEnd|();
Приклад|зразок| мозаїчного(тайлового|) покриття текстурою
Координати прямокутника збігаються з|із| координатами прямокутника в першому прикладі|зразку|. Текстура буде повторена по горизонтальній осі 3 рази, по вертикальній – 2 рази. Для можливості|спроможності| повторення текстури цей режим має бути активований за допомогою команд
3.0
5.0
-1.0
-1.0
y
x
z
GlTexParametri|(GL_TEXTURE_2D|, GL_TEXTURE_WRAP_S|, GL_REPEAT|);
EMBED Word.Picture.8
Вид об’єкта після накладання текстури
GlTexParametri|(GL_TEXTURE_2D|, GL_TEXTURE_WRAP_T|, GL_REPEAT|);
glBegin|(GL_QUADS|);
glTexCoord2f|(0.0, 0.0); glVertex3f|(-1.,-1., 0.); //лівий нижній кут|ріг|
glTexCoord2f|(3.0, 0.0); glVertex3f|( 5.,-1., 0.); //правий нижній кут|ріг|
glTexCoord2f|(3.0, 2.0); glVertex3f|( 5., 3., 0.); //правий верхній кут|ріг|
glTexCoord2f|(0.0, 2.0); glVertex3f|(-1., 3., 0.); //лівий верхній кут|ріг|
glEnd|();
Приклад|зразок| створення|створіння| з|із| допомогою текстур| ефекту віддзеркалення|відображення|.
Необхідно вирішити OPENGL| використовувати координати, що автоматично згенерували. Параметри, за допомогою яких ці координати генеруватимуться, зберігаються в об'єкті текстури, створеному на другому етапі (див. пункт 2.7).
// 1 - вирішуємо автогенерацію координат текстур по осі S
// 2 - вирішуємо автогенерацію координат текстур по осі T
glEnable|(GL_TEXTURE_GEN_S|); // 1
glEnable|(GL_TEXTURE_GEN_T|); // 2
glBegin|(GL_QUADS|);
glVertex3f|(-1.,-1., 0.); //лівий нижній кут|ріг|
glVertex3f|( 5.,-1., 0.); //правий нижній кут|ріг|
glVertex3f|( 5., 3., 0.); //правий верхній кут|ріг|
glVertex3f|(-1., 3., 0.); //лівий верхній кут|ріг|
glEnd|();
// 3 - забороняємо автогенерацію координат текстур по осі S
// 4 - забороняємо автогенерацію координат текстур по осі T
glEnable|(GL_TEXTURE_GEN_S|); // 3
glEnable|(GL_TEXTURE_GEN_T|); // 4
Завдання|задавання| до лабораторної роботи і порядок|лад| виконання.
1. Підготуйте зображення до використання як текстура. Як зображення вибирається будь-яке зображення, що є|наявний| на комп'ютері. За відсутності таких зображення створюється в графічному редакторові.
2. Створіть об'єкт текстури.
3. Набудуйте|настройте| параметри об'єктів текстур, відповідно до варіанту.
4. Змалюєте|зображатимете| об'єкт відповідно до варіанту
5. Накладете текстури на створений геометричний об'єкт.
6. Реалізуйте зміну параметрів текстури при натисненні клавіш відповідно до варіанту.
Контрольні питання.
Що розуміється під терміном «текстура»?
Який сенс|зміст| використання текстур| при візуалізації? Якому рівню візуалізації відповідає текстурування?
Що таке «тексель|»?
Що є координатами текстур?
Які дії необхідно виконати для накладення текстури на об'єкт?
Які режими фільтрації використовуються при накладенні текстур|?
У чому полягає первинне скріплення|зв'язування|?
Яким чином здійснюється пов'язання|зв'язування| зображення з текстурою?
Яким чином за допомогою текстур| може бути досягнутий ефект віддзеркалення|відображення|?
Чому необхідне узгодження геометричних і текстур координат? Як це досягається?