Jak wdrożyć cienie 2D rzucane między warstwami?

10

Jak mogę zaimplementować cienie 2D, które są rzucane przez obiekty na innej warstwie?

NIE podoba się dynamiczne oświetlenie w dobrze znanym samouczku z Catalin Zima :

wprowadź opis zdjęcia tutaj

Ale podobnie jak cienie rur w tym filmie :

wprowadź opis zdjęcia tutaj

Podobnie jak cień platformy i postać w tym filmie :

wprowadź opis zdjęcia tutaj

Chciałbym zastosować ten sam rodzaj oświetlenia w scenie z wieloma warstwami i dużą ilością świateł o różnych kolorach.

Mogę to sobie wyobrazić, rysując czarną kopię warstwy nad warstwami za tą warstwą i dostosowując ją do otworów w warstwach, na które rzucany jest cień. Mam jednak nadzieję, że istnieje tańsze podejście oparte na procesorach pikseli.

Jagoda
źródło

Odpowiedzi:

1

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.

Sean Middleditch
źródło
Tak, właśnie to wymyśliłem. Nie wiedziałem jednak, że to właściwe maskowanie. Miałem jednak nadzieję, że może istnieć algorytm bardziej podobny do tego, jak objętości cienia działają w przestrzeni 3D ..
Berry
Kiedy rzucasz cienie na powierzchnie z dziurami, musisz rzucić cień rezydentny na warstwę za nim. Również praca z przezroczystością stanie się nieco trudna. Myślałem już o wszystkich rozwiązaniach tych problemów! Pomyślałem jednak, że stosowanie w czasie rzeczywistym byłoby zbyt drogie, szczególnie w przypadku wielu warstw (20) i dużej ilości świateł (50). Właśnie dlatego liczyłem na inne podejście.
Berry,