Obsługa wielu świateł w scenie (za pomocą shaderów)

9

Jestem ciekawy, jak radzić sobie z wieloma światłami w scenie. Biorąc pod uwagę bardzo dużą mapę w grze fabularnej, z lochami (ze światłami) itp. Wiem o odroczonym oświetleniu, ale to tylko wyjaśnia, jak renderować wiele świateł. Ale moje pytanie brzmi: jak nie renderować wielu świateł. Jest oczywiście pożądane, aby renderować tylko światła wpływające na scenę, ale nie znam techniki / algorytmu do archiwizacji tego. Nikt nie chce lub nawet nie jest w stanie renderować 500 punktowych świateł, tylko dlatego, że gdzieś na mapie. Ale nie można po prostu poprowadzić linii prostej od światła do gracza i sprawdzić, czy coś jest pomiędzy. Odległość również nie wydaje się dobrym wskaźnikiem. (Światło słoneczne?)

tl; dr: Jak mogę dowiedzieć się, które światła wpływają na scenę, aby je tylko renderować?

blubb
źródło
OpenGL czy DirectX?
kravemir
6
właściwie 500 świateł byłoby całkiem możliwe z odroczonym oświetleniem, o ile nie chcesz cieni dla wszystkich;)
Na przykład dla ligandów punktowych i stożkowych można użyć tłumienia okluzji - światło punktowe to tylko kula. Światło kierunkowe widać zewsząd
Kikaimaru
4
@Darkwings Opisujesz tutaj, o co prosił Blubb. Jak mam chodzić? Myślę, że rozwiązaniem jest chodzenie! (Pracowałem dla mnie.) ;-) „musisz wiedzieć, czy to źródło oświetla coś w twoim polu widzenia”. <- O to właśnie prosi, chce wiedzieć, jak to zrobić. ^^ Mimo że stożek / kula z Kikaimaru jest prawdopodobnie pomocna.
cooky451
1
Dla OP nie było oczywiste sprawdzenie frustum widoku, ponieważ wspomniał tylko o odległości. Każde światło będzie miało pewne parametry, aby to ustalić. Jeśli zastosowane zostaną światła kierunkowe, będą one docierały wszędzie, światła punktowe będą miały strefę docelową (aby można je było rozwiązać za pomocą przecięcia płaszczyzny wektorowej) i tak dalej. Powinieneś pomyśleć więcej na temat tego, które światła chcesz wpłynąć na scenę, biorąc pod uwagę, że jeśli naprawdę masz naprawdę dużo świateł bardzo blisko siebie, lepiej będzie ci się przybliżyć (do rzucania cienia). IE: 100 świec na antycznym żyrandolu można traktować jako pojedyncze światło.
Darkwings

Odpowiedzi:

5

Jeszcze prostsze niż granice woluminów;

Przypisz promień do każdego światła. Jeśli chodzi o renderowanie sceny, po prostu sprawdź, czy odległość między obiektami sceny a każdym światłem jest mniejsza niż promień światła. Jeśli tak, użyj światła, w przeciwnym razie pomiń go.

Tylko ułamek bardziej skomplikowany, w zależności od tego, jak ważna jest wydajność:

Z tym też możesz zrobić rodzaj szerokiej kontroli fazy. Po prostu zdefiniuj siatkę przestrzenną, która przechowuje uchwyty do twoich świateł na podstawie komórki siatki, a następnie wykonaj tylko sprawdzanie odległości na światłach znajdujących się w komórkach w obrębie maksymalnego promienia obiektów sceny.

Mydliny
źródło
5
+1 - Brzmi podejrzanie jak sfera graniczna;)
Gyan alias Gary Buyn
Trochę późno ... w każdym razie, ta właśnie sfera granicząca. Korzystając z tej metody, nadal renderujesz światła, które są całkowicie zasłonięte ścianami itp., A zatem nie są istotne dla sceny. Ponadto nie każde światło idzie w każdym kierunku.
Darkwings,
5

Najprostszym sposobem, jaki mogę wymyślić (szczerze mówiąc, to jedyny sposób, o którym myślałem), to nadanie każdemu światłu ograniczającej objętości . Jeśli objętość graniczna przecina się z fragmentem widoku (lub objętością ograniczającą fragment widoku), zastosuj światło.

Nadal mogą być zastosowane światła, mimo że nie wpływają na żadne widoczne obiekty, ale jest to proste i szybkie. Inteligentne ułożenie wykresu sceny może oznaczać, że tylko kilka skrzyżowań sprawdza, czy większość świateł nie gaśnie (podobnie jak w przypadku maskowania obiektów).

Coś takiego jak słońce nie może mieć ograniczającej objętości (co oznacza, że ​​zawsze należy je stosować).

Gyan alias Gary Buyn
źródło