Można to zrobić za pomocą maskowania. Można to zrobić na wiele sposobów.
Jednym ze sposobów byłby sposób renderowania cieńowej wersji elementów pierwszego planu. Narysuj tło. Następnie narysuj elementy pierwszego planu, lekko przesunięte w zależności od tego, w jaki sposób chcesz przesunąć oświetlenie, w taki sposób, aby wyświetlać tylko czarne kolory. Następnie narysuj normalnie pierwszy plan.
Innym sposobem byłoby przekształcenie pierwszego planu w bufor, nieco więcej niż można by zobaczyć. Następnie wykonaj jakieś przejście do „czarnego”, a może przejście rozmycia. Teraz wyrenderuj wynik tego zestawu przebiegów, a następnie widoczną sekcję buforu pierwszego planu.
Aby obsługiwać wiele lampek pod różnymi kątami, możesz po prostu zrobić poprzedni krok wiele razy lub zgromadzić je wszystkie w jednym buforze. Matematyka będzie się różnić w zależności od tego, co próbujesz osiągnąć, ale pierwsze przypuszczenie, co dzieje się w tym pierwszym filmie, polega na tym, że po prostu przyjmują pozycję światła w stosunku do pozycji kamery (środek widocznego obszaru) i następnie użyj tego wektora (przeskalowanego), aby określić sposób kompensacji cieni. Coś jak:
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
Światła, które są „bliżej” sceny, będą miały mniejszy współczynnik skali. Jeśli chcesz mieć wiele głębokości, musisz trochę matematyki, proste geometryczne rzeczy.