Як досягти світла, який змінює колір посередині?


11

Я думав створити джерела світла та кілька кольорових вікон. Тепер вікна напівпрозорі. Як я міг зробити так, щоб, коли світло (скажімо, чисто білий) потрапив у скло і продовжував через нього, але змінив колір на той самий колір, що і скло, яке воно пройшло?

Я знаю, що ефект, описаний тут, може бути підроблений, використовуючи освітлення області на "кольоровій" стороні вікна, але що робити, якщо я просто хотів мати одне біле точкове світло?


Замість зміни кольору світла ви могли б змінити базовий колір освітлених предметів з іншого боку склянки? можливо, це зробить трюк?
HumanCatfood

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

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

Відповіді:


14

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

Швидкий і брудний

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

Інший варіант - вказати вікна як об’єкти, що лежать на літаках. Спочатку випробуйте, щоб переконатися, що геометрія та світло розташовані на протилежних сторонах площини, а потім, якщо шлях між ними перетинає площину в точці в межах вікна. Це було б точніше, ніж перший метод, і було б простіше встановити вікна в однакові інтер’єри з різними кольорами скла.

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

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

Карти тіней

Інший варіант - зробити щось подібне до тіньового картографування.

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

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

Якщо ваш фрагмент геометрії віддалений від відстані на цій карті, тоді використовуйте колір карти, якщо він не є, тоді використовуйте оригінальний світлий колір.

Функція для обчислення кольору кожного пікселя на карті повинна бути приблизно; lightColor - перевернутеWindowColor. Отже, для чистого білого світла та чистого червоного вікна, яке не поглинає жодного із червоного спектру, який ми отримуємо; (255,255,255) - (0,255,255) = (255,0,0). Тож колір світла з іншого боку - чисто червоний. Для більш складного прозорого предмета, наприклад вітража, ви можете мати пошук текстури, щоб отримати колір матеріалу.

Якщо ви шукаєте щось подібне, ознайомтеся зі світловідбиваючими картами тіней .

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

Спроба загального рішення

Останнім часом стало популярним кодувати інформацію освітлення у поданні вокселів (вони не тільки для геометрії). Останній двигун crytek використовує цю стратагію для вдосконаленого освітлення ( обсяги поширення світла ).

Ось загальна ідея:

  • Створіть карту рівномірно розташованих кубів, яка охоплює вашу сцену (розгляньте використання кривих z-порядку ).
  • Знайдіть спосіб збереження інформації про освітлення, що падає, для кожного вокселя (сферичні гармонічні зображення тут корисні).
  • Знайдіть воксель, що містить світло, і представляйте його у вокселі.
    • Поширюйте світло назовні через сусідні вокселі (на кшталт води в Minecraft)
    • Обчисліть, як геометрія кожного вокселя буде впливати на світло, що проходить через нього (поглинати, відбивати, передавати)
    • повторюйте, поки світло не згасне

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

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


Дякуємо за тривалий пост! Наразі я розслідую, чи буду я робити вперед чи відкладати рендерінг для поточного проекту, над яким я працюю. На даний момент це, мабуть, буде відкладено. Як би ви зробили, коли вікно різнобарвне (скажімо, вітраж у церкві)?
manabreak

@manabreak - Я б використав розширення тіньової карти, оскільки це запропонувало б найкращий рівень вірності для цього випадку. Я відредагую пост, щоб пояснити це.
OriginalDaemon

Джи, дякую! Цей пост дійсно зробив свій день, я, мабуть, ніколи не бачив, щоб так багато зусиль доклали до жодної публікації.
manabreak
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.