Це можна зробити за допомогою маскування. Існує кілька способів зробити це.
Одним із способів було б мати спосіб відобразити тіньову версію елементів переднього плану. Намалюйте фон. Потім намалюйте елементи переднього плану, злегка змістіть їх залежно від того, як ви хочете, щоб рухалося освітлення, таким чином, щоб ви виводили лише чорні кольори. Потім нормально намалюйте передній план.
Іншим способом було б передати передній план у буфер, трохи більше, ніж ви насправді бачили. Тоді зробіть декілька пропусків "до чорного", а може і пропуск. Тепер виведіть вихід цього набору пропусків, а потім видимий розділ буфера переднього плану.
Для підтримки декількох світильників під різними кутами ви можете просто зробити попередній крок кілька разів або зібрати їх усі в одному буфері. Математика змінюватиметься залежно від того, що ви намагаєтесь досягти, але спочатку здогадуйтесь, що відбувається в першому відео, це те, що вони просто приймають положення світла проти положення камери (центр видимої області) і потім використовуйте цей вектор (масштабований), щоб визначити, як зрушити тіні. Щось на зразок:
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
Вогні, які знаходяться «ближче» до сцени, матимуть менший масштабний коефіцієнт. Якщо ви хочете отримати кілька глибин, там є якась математика, яка може працювати там, прості геометричні речі.