Nie wiem, w czym programujesz, ale tak sobie z tym poradziłem w XNA:
- Podczas wywołania losowania
List<Light>
obiekt jest tworzony / usuwany.
- Podczas pętli losowania kafelków każdy kafelek jest sprawdzany, aby sprawdzić, czy ma z nim jakieś Światła. Jeśli tak,
Light
obiekty są dołączane do List<Light>
.
- Kafelki są rysowane same
RenderTarget2D
.
- Po pętli kafelkowej lista
Light
s jest iterowana i rysowana samodzielnie RenderTarget2D
przy użyciu utworzonej przeze mnie tekstury, która wygląda tak:
(Uwaga: Użyłem tutaj wartości R, G i B, ale prawdopodobnie powinieneś użyć kanału alfa w swoim faktyczna tekstura.)
- Używając niestandardowego modułu cieniującego, renderuję powierzchnię kafelka na ekran i przekazuję powierzchnię oświetlenia jako parametr, który jest próbkowany pod kątem wartości „ciemności” przy każdym pikselu.
Warto zwrócić uwagę na kilka rzeczy:
W odniesieniu do punktu 4:
Mam dwa niestandardowe moduły cieniujące, jeden do narysowania świateł do celu renderowania oświetlenia (krok 4), a drugi do narysowania celu renderowania kafelków na ekranie za pomocą celu renderowania oświetlenia (krok 5).
Moduł cieniujący użyty w punkcie 4 pozwala mi dodać (jak to nazywam) wartość „luminosity”. Ta wartość jest float
mnożona przez każdy piksel w teksturze, zanim zostanie dodany do celu renderowania, dzięki czemu mogę zasadniczo rozjaśnić lub przyciemnić światła.
W tym momencie biorę również pod uwagę wartość „skali” światła, co oznacza, że mogę mieć duże lub małe światła przy użyciu tylko jednej tekstury.
W odniesieniu do punktu 5:
Pomyśl o celu renderowania oświetlenia, który zasadniczo ma wartość dla każdego piksela od 0 (czarny) do 1 (biały). Moduł cieniujący zasadniczo zwielokrotnia tę wartość w stosunku do wartości RGB piksela w celu renderowania kafelków, aby utworzyć ostatecznie narysowany obraz.
Mam też trochę kodu, w którym przekazuję (do modułu cieniującego) wartość, która ma być użyta jako kolor nakładki dzień / noc. Jest to również mnożone przez wartości RGB i uwzględniane w obliczeniach celu renderowania oświetlenia.
Teraz nie pozwoli ci to robić takich rzeczy jak blokowanie światła przed obiektami i tak dalej, ale przynajmniej dla moich celów jest to proste i działa dobrze.
Pisałem bardziej szczegółowy blogu tutaj i tutaj , które mogą Ci pomóc. Nie mam teraz czasu, ale jeśli chcesz, mogę zagłębić się tutaj w gamedev.
Aha, a oto spojrzenie na to w moim edytorze map: