- •Комп’ютерна графіка
- •Лабораторна робота №1 Тема: «Вступ в програмування з використанням opengl»
- •Лабораторна робота №2 Тема: «Перетворення координат»
- •Робота з матрицями
- •Видові перетворення
- •Проекції
- •Область виводу
- •Лабораторна робота №3 Тема: «Створення реалістичних зображень з використанням властивостей геометричного об'єкту»
- •Властивості матеріалу
- •Джерела світла
- •Модель освітлення
- •Текстури
- •Підготовка текстури
- •Параметри текстури
- •Координати текстури
- •Створення спецефектів
- •Прозорість
- •Глосарій
- •Список рекомендованої літератури
- •Додаток а
- •Параметри моделі освітлення (glLightModel)
- •Параметри матеріалу (glMaterial)
- •Параметри джерела світла (glLight)
- •Додаток б Програма курсу «Комп’ютерна графіка»
- •Комп’ютерна графіка
Параметри текстури
При накладенні текстури, як уже згадувалося, потрібно враховувати випадок, коли розміри текстури відрізняються від розмірів об'єкту, на який вона накладається. При цьому можливо як розтягування, так і стискування зображення, і те, як проводитимуться ці перетворення може серйозно вплинути на якість побудованого зображення. Для визначення положення точки на текстурі використовується параметрична система координат (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<NUM_TEXTURES*/
/* 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();