Як я реалізую 2D тіні, відлиті між шарами?


10

Як я міг реалізовувати 2d тіні, відлічені об'єктами в іншому шарі?

НЕ подобається динамічне освітлення у відомому підручнику від Каталіна Зіми :

введіть тут опис зображення

Але як тіні труб у цьому відео :

введіть тут опис зображення

І як тінь платформи та персонаж у цьому відео :

введіть тут опис зображення

Мені б хотілося використовувати одне і те ж освітлення в сцені з безліччю шарів і безліччю світла з різними кольорами.

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

Відповіді:


1

Це можна зробити за допомогою маскування. Існує кілька способів зробити це.

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

Іншим способом було б передати передній план у буфер, трохи більше, ніж ви насправді бачили. Тоді зробіть декілька пропусків "до чорного", а може і пропуск. Тепер виведіть вихід цього набору пропусків, а потім видимий розділ буфера переднього плану.

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

draw background
for each light intersecting viewing bounds:
  offset = light.position - camera.position
  offset *= SCALE FACTOR (0.25 maybe)
  draw shadow foreground at offset
draw foreground

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


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

Коли ви кидаєте тіні на поверхні з отворами в них, вам слід кинути резидентську тінь на шар за цим. Також робота з прозорістю стане дещо хитрою. Я вже продумав усі рішення цих проблем! Але я подумав, що це стане занадто дорого застосовувати в режимі реального часу, особливо коли мова йде про багато шарів (20) та багато світла (50). Тому я сподівався на інший підхід.
Беррі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.