Освітлення в OpenGL, Комп’ютерна графіка

Висвітлення будь-якого простору - це процес, завдяки якому цей простір наповнюється світлом і всі предмети, що знаходяться в ньому, робляться видимими. Освітлення будь-якого об'єкта залежить від двох факторів:

  • Перший - це матеріал, з якого виготовлено об'єкт.
  • Другий - це світло, яким він освітлений.

Залежно від реалізації OpenGL на сцені можуть бути вісім і більше джерел світла. За замовчуванням освітлення вимкнено. Увімкнути нульове джерело світла можна командою:

Інші включаються аналогічним способом, де замість GL_LIGHT0 вказується GL_LIGHTi. Після того, як джерело увімкнено, необхідно задати його параметри. Якщо монотонне тіло у вас рівномірно освітлене, то ви не можете побачити його рельєф. Тому потрібно використовувати джерела світла. В OpenGL існує три типи джерел світла:

  • джерело спрямованого світла: розташований у нескінченності та має виділений напрямок освітлення.
  • точкове джерело світла: розташований у конкретній точці простору і світить рівномірно у всіх напрямках. Для нього можна задати ефект загасання світла з відстанню
  • прожектор: є окремим випадком точкового джерела, але світло від нього поширюється тільки всередині конуса, що обмежує, а не по всіх напрямках.

Для керування властивостями джерела світла використовуються команди glLight*:

  • glLightf(GLenum light, GLenum pname, GLfloat param); glLightfv(GLenum light, GLenum pname, const GLfloat *param);

Параметр light вказує OpenGL для якого джерела світла задаються параметри. Команда glLightf використовується для завдання скалярних параметрів, а glLightfv використовується для завдання векторних характеристик.джерел світла.

Спочатку розглянемо функцію, яка встановлює базові налаштування. Коли ви дозволили освітлення, ви можете вже встановлювати фонову освітленість. За умовчанням значення фонової освітленості дорівнює (0.2, 0.2, 0.2, 1). Створіть новий проект, скопіюйте туди шаблонний файл та вимкніть освітлення. Ви насилу зможете розрізнити сферу на екрані. За допомогою функції glLightModel можна встановити фонове освітлення. Якщо ви підвищите його до (1,1,1,1), тобто. до максимуму, то вмикати джерела світла вам не знадобиться. Ви їх дії не помітите, т.к. об'єкт вже максимально освітлений. І вийде, що ви відключили освітлення. Загалом додайте в main виклик наступної функції:

  • float ambient[4] = ; . glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient);

Спробуйте змінити параметри та подивіться на результат.

Матеріал Матеріал може розсіювати, відбивати та випромінювати світло. Властивості матеріалу встановлюються за допомогою функції

  • glMaterialfv(GLenum face, GLenum pname, GLtype* params)

Перший параметр визначає грань, на яку встановлюються властивості. Він може приймати одне з таких значень:

  • GL_BACK задня грань GL_FONT передня грань GL_FRONT_AND_BACK обидві грані

Другий параметр функції glMaterialfv визначає властивість матеріалу, який буде встановлений, і може набувати наступних значень.

  • GL_AMBIENT розсіяне світло GL_DIFFUSE теж розсіяне світло GL_SPECULAR відбите світло GL_EMISSION випромінюване світло GL_SHININESS ступінь відбитого світла GL_AMBIENT_AND_DIFFUSE обидва розсіяні світла

Колір задається як масиву з чотирьох елементів - RGBA. У разі GL_SHININESS paramsвказує на число типу float, яке має бути в діапазоні від 0 до 128. Вам потрібно лише модифікувати функцію display.

  • void CALLBACK display(void) GLUquadricObj *quadObj; GLfloat front_color[] = ; GLfloat back_color[] = ; quadObj = gluNewQuadric(); glClear( GL_COLOR_BUFFER_BIT GL_DEPTH_BUFFER_BIT ); glMaterialfv(GL_FRONT, GL_DIFFUSE, front_color); glMaterialfv(GL_BACK, GL_DIFFUSE, back_color); glPushMatrix(); glRotated(110, -1,1,0); gluCylinder(quadObj, 1, 0.5, 2, 10, 10); glPopMatrix(); gluDeleteQuadric(quadObj); auxSwapBuffers(); >

І ви маєте дозволити режим освітленості для двох граней. За замовчуванням його заборонено. Додайте в функцію main наступний рядок.

Джерела спрямованого світла Джерела світла такого типу знаходиться в нескінченності і світло від нього поширюється в заданому напрямку. Ідеально підходить для створення рівномірного освітлення. Хорошим прикладом джерела спрямованого світла може бути Сонце. У джерела спрямованого світла, крім компонентів випромінювання, можна задати тільки напрямок.

  • GL_POSITION (0.0, 0.0, 1.0, 0.0) //(x, y, z, w) напрямок джерела спрямованого світла

Перші три компоненти (x, y, z) задають вектор напряму, а компонента w завжди дорівнює нулю (інакше джерело перетвориться на точковий).

Функції згасання Це функція зміни інтенсивності освітлення (інтенсивність світла не зменшується з відстанню), використовується разом з точковим освітленням

  • GL_POSITION(0.0, 0.0, 1.0, 0.0)//позиція джерела світла (за замовчуванням джерело світла спрямоване)
  • GL_CONSTANT_ATTENUATION 1.0 //постійна k_const у функції загасання f(d)
  • GL_LINEAR_ATTENUATION 0.0//коефіцієнт k_linear при лінійному члені функції загасання f(d)
  • GL_QUADRATIC_ATTENUATION 0.0 //коефіцієнт k_quadratic при квадраті відстані функції загасання f(d)

Прожектори Однією з різновидів точкового джерела є прожектор. Для нього застосовні всі параметри, що і для точкового джерела, але також прожектор дозволяє обмежити поширення світла конусом. Для цього конуса можна задати коефіцієнт зменшення інтенсивності, залежно від кута між віссю конуса і променем поширення світла.

  • GL_SPOT_DIRECTION (0.0, 0.0, -1.0) //(x, y, z) - напрямок прожектора (вісь обмежуючого конуса)
  • GL_SPOT_CUTOFF 180.0 //кут між віссю та стороною конуса (він же половина кута при вершині)
  • GL_SPOT_EXPONENT 0.0 //експонента зменшення інтенсивності

Тіні Тіні безпосередньо не підтримуються бібліотекою OpenGL, тому їх потрібно розбирати окремо.