Это можно сделать с помощью маскировки. Есть несколько способов сделать это.
Одним из способов было бы иметь способ визуализации теневой версии элементов переднего плана. Нарисуйте фон. Затем нарисуйте элементы переднего плана, слегка смещенные в зависимости от того, как вы хотите, чтобы освещение двигалось, таким образом, чтобы вы выводили только черные цвета. Затем нарисуйте передний план нормально.
Другим способом было бы сделать передний план в буфер, немного больше, чем вы могли бы увидеть. Затем сделайте проход «черным» и, возможно, размытие. Теперь визуализируйте выходные данные этого набора проходов, а затем видимую часть буфера переднего плана.
Чтобы поддерживать несколько источников света под разными углами, вы можете просто выполнить предыдущий шаг несколько раз или накопить их все в одном буфере. Математика будет варьироваться в зависимости от того, чего вы пытаетесь достичь, но первое предположение о том, что происходит в этом первом видео, состоит в том, что они просто принимают положение света против положения камеры (центр видимой области) и затем используйте этот вектор (масштабированный), чтобы определить, как сместить тени. Что-то вроде:
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
Свет, который «ближе» к сцене, будет иметь меньший масштабный коэффициент. Если вы хотите использовать несколько глубин, вам понадобится математика, простые геометрические вещи.