Освітлення (комп'ютерна графіка)

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку
Сцена отримана за допомогою рендеру RRV[1] (проста реалізація розповсюдження світла на основі OpenGL) 79-та ітерація.

У 3D комп'ютерній графіці, освітлення є застосуванням методу скінченних елементів для розв'язання рівняння рендерингу для сцен з поверхнями, які дифузно відбивають світло. На відміну від методів візуалізації, які використовують алгоритми Монте-Карло (такі, як трасування шляху), які обробляють всі можливі види шляхів світла, типове освітлення для розрахунку використовує лише шляхи (представлені кодом «LD*E»), які виходять з джерела світла і відбиваються дифузно деяке число раз (можливо і нульове) поки не потраплять в очі. Освітлення — це алгоритм глобального освітлення в тому сенсі, що освітлення потрапляє на поверхню не тільки безпосередньо від джерел світла, але і від інших поверхонь, які його відбивають. Освітлення не залежить від точки спостереження, внаслідок чого збільшує кількість розрахунків, але їх можна використовувати для всіх точок огляду.

Методи освітлення були вперше розроблені приблизно в 1950 році в інженерній галузі теплообміну. Пізніше вони були удосконалені спеціально для задачі візуалізації комп'ютерної графіки в 1984 році дослідниками з Корнелльського університету[2] і Хіросімського університету.[3]

Відомі комерційні рушії Enlighten від Geomerics[en] (використовується для ігор, наприклад Battlefield 3 і Need For Speed: The Run); 3ds Max; Form-Z[en]; LightWave 3D[en] і Electric Image Animation System[en].

Візуальні характеристики[ред. | ред. код]

Різниця між стандартним прямим освітленням без напівтіней[en], і освітлення з напівтінями.

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

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

Зображення справа отримане з використанням алгоритму освітлення. Є тільки одне джерело світла: зображення неба, що розташовано за межами вікна. Візуально різниця помітна. Кімната сяє світлом. М'які тіні видно на підлозі, і у кімнаті помітні тонкі ефекти освітлення. Крім того, червоний колір килима відбивається на сірих стінах, надаючи їм злегка теплий зовнішній вигляд. Жоден з цих ефектів не був спеціально обраним або розробленим художником.

Огляд алгоритму освітлення[ред. | ред. код]

Кожна поверхня при візуалізації сцени ділиться на декілька невеликих поверхонь (латок). Коефіцієнт видимості[en] обчислюється для кожної пари латок; це коефіцієнт, що описує наскільки добре одна латка бачить іншу. Латки, які знаходяться далеко одна від одної, або орієнтовані під кутом відносно одна до одної, будуть мати менші коефіцієнти. Якщо інші латки зустрічаються на шляху, коефіцієнт видимості буде зменшений або дорівнюватиме нулю, в залежності від того, є оклюзія частковою або повною.

Коефіцієнти видимості використовуються як коефіцієнти лінійної системи рівнянь рендерингу. Рішення цієї системи дає освітлення, або яскравість кожної латки з враховуванням м'яких тіней.

Прогресивне освітлення вирішує систему ітеративно з проміжними значеннями освітлення для латки, відповідними до кількості відбиттів. Тобто, після кожної ітерації, ми знаємо, як сцена виглядатиме після одного відбиття світла, двох відбиттів, тощо. Це корисно для отримання інтерактивного перегляду сцени. Крім того, користувач може зупинити ітерації після того, як зображення виглядатиме досить добре, а не чекати завершення процесу обчислень.

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

Іншим розповсюдженим методом для вирішення рівняння освітлення є «знімання освітлення» (англ. shooting radiosity), який повторно вирішує рівняння освітлення шляхом «вистрілюючи» світло з латки з найбільшою кількістю енергії на кожному кроці. Після першої операції, будуть освітлені тільки ті латки, які знаходяться в прямій видимості від латок (латки), що випромінюють світло. Після другої вже більше латок будуть освітлюватися. Сцена продовжує ставати яскравішою і зрештою досягає стійкого реалістичного стану.

Математичне формулювання[ред. | ред. код]

Основний метод освітлення має свою основу в теорії теплового випромінювання, бо освітлення ґрунтується на обчисленні кількості світла, енергії, що передається між поверхнями. Для спрощення обчислень, метод передбачає, що всі розсіювання є абсолютно дифузними[en]. Поверхні, як правило, дискретизовані в чотирикутні або трикутні латки, над якими визначається частково-поліноміальна функція.

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

Точніше, радіус B — це енергія на одиницю площі, що залишає поверхню латки за дискретний інтервал часу, і є поєднанням випромінюваної та віддзеркаленої енергій:

де:

  • B(x)i dAi — загальна енергія, яка залишає невелику площу dAi навколо точки x.
  • E(x)i dAi — випромінювана енергія.
  • ρ(x) — дзеркальна здатність точки, яка дає зважену енергію на одиницю площі шляхом множення побічної енергії на одиницю площі (загальна енергія, яка надходить з інших латок).
  • S означає, що змінна інтегрування x' проходить по всіх поверхнях сцени.
  • r — відстань між x та x'.
  • θx та θx' — кути між прямою, що з'єднує x та x' і вектори нормалі до поверхні в точках x та x' відповідно.
  • Vis(x,x' ) — функція видимості, визначається як 1, якщо дві точки x та x' бачать одна одну, і 0, якщо ні.
Геометричний коефіцієнт видимості (або «проєктування тілесного кута») Fij.

Fij можна отримати шляхом проєктування елемента Aj на зовнішню частину півсфери, а потім — на одиничне коло. Коефіцієнт при цьому дорівнює частці одиничного кола, яка охоплюється цією проєкцією.

Коефіцієнти підкоряються взаємному співвідношенню AiFij = AjFji

Якщо поверхня апроксимується кінцевим числом плоских латок, кожна з яких має постійне освітлення Bi та відображення ρi, то наведене вище рівняння дає дискретне рівняння освітлення,

де Fij — це геометричний коефіцієнт видимості[en] для випромінювання, що виходить з j та потрапляє у латку i.

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

Методи розв'язання[ред. | ред. код]

Рівняння може бути формально розв'язано, як матричне рівняння для отримання векторного рішення:

Це безпосередньо дає рішення для B, яке є результатом «нескінченного відбиття». Однак, кількість розрахунків для обчислення матриці ваги відповідає n3, де n — число латок. Це стає непосильним для реально великих значень n.

Натомість рівняння легше розв'язати ітеративно, шляхом багаторазового застосування формули оновлення освітлення крок за кроком. Формально це розв'язання матричного рівняння методом Якобі. Оскільки відбивна здатність ρi менша за 1, процес збігається швидко, як правило, для отримання розумного рішення потрібно лише кілька ітерацій. Інші стандартні ітераційні методи матричного розв'язання можна також використовувати, наприклад метод Гаусса-Зейделя, коли оновлені значення для кожної латки використаються, щойно вони будуть обчислені, і немає потреби у синхронному оновленні в кінці кожної ітерації. Використовуючи властивість коефіцієнта видимості, Ai Fij = Aj Fji, рівняння оновлення може бути переписане з точки зору коефіцієнта видимості Fji для кожної латки Aj:

Це іноді називають формулюванням «потужності», оскільки тепер оновлюється сукупна передана потужність кожного елемента, а не його освітлення.

Сам коефіцієнт видимості[en] Fij може бути обчислений декількома способами. Ранні методи використовували напівкуб[en] (уявний куб з центром на першій поверхні, на який проєктувалася друга поверхня; його винайшли Майкл Ф. Кохен[en] і Дональд П. Грінбекг[en] в 1985 році). Поверхня напівкубу була розділена на пікселі як квадрати, для кожного з яких коефіцієнт видимості можна легко розрахувати аналітично. Повний коефіцієнт може потім бути апроксимований шляхом підсумовування внеску кожного з пікселеподібних квадратів. Проєкція на напівкуб, яка може бути адаптована до стандартних методів визначення видимості полігонів, також розв'язує проблему появи латки, яка частково затіняє інші, що розташовані позаду.

Однак наведений підхід обчисльно витратний, бо в ідеалі коефіцієнти мають бути отримані для кожної можливої пари латок, що призводить до квадратичного зростання обчислень, бо кількість виправлень збільшилась. Вони можуть бути дещо знижені за допомогою бінарного розбиття простору, щоб зменшити кількість часу, витраченого на визначення того, які латки повністю приховані від інших в складних сценах; але навіть в цьому випадку, час, витрачений для визначення коефіцієнтів, досі зазвичай масштабується як n log n. Нові методи включають адаптивні інтеграції[4].

Методи вибірки[ред. | ред. код]

Коефіцієнти Fij самі по собі насправді явно не потрібні в будь-якому з рівнянь оновлення; ні для визначення загальної інтенсивності ∑j Fij Bj, яка зібрана з загального виду, ні для оцінки розподілу потужності Aj Bj, що випромінюється. Натомість ці оновлення можна оцінити за допомогою методу вибірки, не вимагаючи при цьому обчислення коефіцієнтів видимості в явному вигляді. З середини 1990-х років такі підходи до вибірки були методами, які найбільше використовувались для практичних розрахунків освітлення.

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

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

Скорочення часу обчислень[ред. | ред. код]

Хоча базовий алгоритм обчислення освітлення має квадратичне збільшення часу із доданою геометрією (поверхні та латки), це не завжди так. Проблему освітлення можна переформулювати як проблему рендерингу текстури відображення сцени. В цьому випадку час обчислення збільшується тільки лінійно із збільшенням числа латок (без урахування складних питань, наприклад використання кеш-пам'яті).

Багато архітекторів і художників-графіків використовувають так звану техніку фальшивого освітлення[en]. Затемнюючи ділянки текстурних мап, що відповідають кутам, стикам і виїмкам і застосовуючи їх за допомогою самоосвітлення або дифузного відбиття, можна створити ефект, подібний до освітлення, взаємодії латок за допомогою стандартного Scanline візуалізатора (див. Ambient occlusion).

Статичне, попередньо розраховане, освітлення може бути зображене в режимі реального часу за допомогою мапи освітлення[en] на поточних настільних комп'ютерах зі стандартним апаратним прискоренням графіки.

Переваги[ред. | ред. код]

Сучасна візуалізація чайника з Юти. Освітлення використовувалось для всіх дифузних висвітлень в цій сцені.

Однією з переваг алгоритму освітлення є те, що його порівняно легко пояснити та реалізувати. Це робить його корисним алгоритмом для навчання студентів глобальним алгоритмам освітлення. Типовий візуалізатор прямого освітлення може містити майже всі алгоритми (перспективні перетворення, текстури, приховані поверхні видалення[en]), що необхідні для здійснення освітлення. Не потрібні поглиблені знання з математики, щоб зрозуміти та реалізувати цей алгоритм.

Обмеження[ред. | ред. код]

Типові методи освітлення враховують лише світлові шляхи виду LD*E, тобто шляхи, які починаються з джерела світла і виконують кілька відбиттів до досягнення очей. Хоча існує кілька підходів для інтеграції інших ефектів освітлення, таких як дзеркальні[5] та глянцеві[6] відбиття, як правило, вони не використовуються для вирішення повного рівняння рендерингу.

Основне освітлення також має проблеми з вирішенням раптових змін видимості (наприклад різкі тіні), бо звичайна модуляція частково-постійних елементів відповідає фільтру низьких частот області простору. Розрив сітки [1] використовує знання подій видимості для створення кращих дискретизацій.

Плутанина в термінології[ред. | ред. код]

Освітлення був чи не першим широко розповсюдженим алгоритмом візуалізації, який враховував дифузне непряме освітлення. Раніше алгоритми, наприклад, трасування променів у стилі Уіттеда[en], могли обчислювати такі ефекти, як відбиття, заломлення та тіні, але, попри те, що вони є надзвичайно глобальними явищами, ці ефекти зазвичай не називали «глобальним освітленням». Як наслідок, терміни «дифузне відображення» та «освітлення» стали плутати з «глобальним освітленням» в просторіччі. Проте це три різні поняття.

Метод освітлення, в контексті комп'ютерної графіки, походить від (і фундаментально є таким самим) методу освітлення в теплообміні. У цьому контексті освітлення — це загальний радіаційний потік (як відбитий, так і перепромінений), що залишає поверхню; це також іноді називають енергетичною світністю. Розрахунок освітленості, а не поверхневих температур, є ключовим аспектом методу освітлення, що дозволяє застосувати методи лінійної матриці до цієї проблеми.

Див. також[ред. | ред. код]

Посилання[ред. | ред. код]

  1. Dudka, Kamil. RRV - Radiosity Renderer and Visualizer. Процитовано 1 лютого 2013.
  2. «Cindy Goral, Kenneth E. Torrance, Donald P. Greenberg and B. Battaile, Modeling the interaction of light between diffuse surfaces», Computer Graphics, Vol. 18, No. 3.
  3. «T. Nishita, E. Nakamae, Half-Tone Representation of 3-D Objects with Smooth Edges by Using a Multi-Scanning Method», Journal of IPSJ, Vol.25, No.5, pp.703-711,1984 (in Japanese)
  4. G Walton, Calculation of Obstructed View Factors by Adaptive Integration, NIST Report NISTIR-6925, see also http://view3d.sourceforge.net/
  5. http://portal.acm.org/citation.cfm?id=37438&coll=portal&dl=ACM
  6. Архівована копія. Архів оригіналу за 12 жовтня 2006. Процитовано 11 грудня 2016.{{cite web}}: Обслуговування CS1: Сторінки з текстом «archived copy» як значення параметру title (посилання)

Подальше читання[ред. | ред. код]

Посилання[ред. | ред. код]

  • RADical, by Parag Chaudhuri (Реалізація зйомки і сортування варіантів прогресивного алгоритму освітлення з OpenGL прискоренням, що тягнеться від GLUTRAD до Colbeck)
  • Radiosity Renderer and Visualizer (проста реалізація освітлення на основі засобів візуалізації OpenGL)
  • Enlighten (Ліцензійний програмний код, який забезпечує в режимі реального часу освітлення для комп'ютерних ігор. Розроблений британською компанією Geomerics[en])