Dlaczego niektóre gry pokazują, że światła świecą przez ściany?

28

W niektórych grach widzę światła świecące przez ściany, nawet jeśli ustawię jakość wideo na wysokich poziomach.

Kilka przykładów gier, w które ostatnio grałem, to Borderlands 2 (wybuchy pocisków) i Call of Cthulhu (latarnie; gra korzysta nawet z silnika Unreal Engine 4).

Czy to błąd, czy istnieją przyczyny związane z wydajnością?

Przykład Borderlands 2: https://youtu.be/9bV83qA6_mU?t=419 (kilka razy, ale szybko)

Pytanie dodatkowe: w tym drugim przypadku, czy istnieje jakiś sposób, by ray tracing mógł być tanio wykorzystany do rozwiązania problemu? Myślę, że drogi RT zdecydowanie rozwiązał problem, ale zastanawiam się, czy można go również użyć w „taniej” formie, aby rozwiązać ten konkretny problem.

Marcus
źródło
21
Obraz jest wart 1000 słów.
Evorlor
8
Musiałbym zagrać, żeby przetestować, ale czy to światło przecieka, czy może to efekt świecącej cząsteczki? Szczególnie twój przykład eksplozji pocisku, mógłbym wyobrazić sobie dodatkowy efekt cząstki „ognia”, który prawdopodobnie zignoruje zderzenia. Latarnie mogłyby zrobić to samo, aby stworzyć widoczną aureolę, jak sądzę ...
AC
@Evorlor dodał jeden przykład.
Marcus

Odpowiedzi:

43

Rozwijając poprawną odpowiedź TomTsagk, pomyślałem, że może pomóc trochę lepiej opisać, dlaczego gry działają w ten sposób.

Światło w grach tak naprawdę nie „przemieszcza się” ze źródła, na powierzchnię, do kamery, przeszkadzając po drodze.

Aby dowiedzieć się, jak jasno rysować każdy piksel powierzchni w oparciu o dane światło, używamy (lub w przybliżeniu) wzoru matematycznego, który wykorzystuje skierowany w kierunku powierzchni i kierunek od tego punktu na powierzchni do źródła światła. To wszystko, tylko kierunek, z którego świeci - zwykle nie rzucamy promienia, aby sprawdzić, czy światło rzeczywiście dociera do tego piksela, ponieważ robienie tego dla każdego piksela na ekranie i sprawdzanie promienia względem całej szczegółowej geometrii w scenie jest zwykle wciąż zbyt drogie dla gier w czasie rzeczywistym.

Domyślnie żadne światła gry nie rzucają cieni. Kierunek do światła pozostaje taki sam, nawet jeśli przeszkadza mu cień, więc matematyka daje nam tę samą wartość jasności.

Jeśli chcemy symulować cienie, musimy to zrobić osobno. Jednym z powszechnych sposobów jest tak zwana mapa cieni. W tej wersji, zanim zaciemnimy naszą scenę, najpierw renderujemy scenę z perspektywy każdego światła, tak jakby to światło było kamerą, przechowującą głębokość każdego piksela, który widzi, w teksturę poza ekranem.

Następnie, kiedy cieniujemy scenę, możemy porównać matematyczną odległość tego piksela od źródła światła z głębokością zarejestrowaną dla odpowiedniego piksela na mapie cienia. Jeśli głębokość mapy cienia jest mniejsza, oznacza to, że jest tu inna powierzchnia między światłem a światłem, a my piksel ten rysujemy w cieniu.

Istnieje wiele fajnych technik, dzięki którym te cienie oparte na mapie wyglądają ładniej, z mniejszą liczbą artefaktów / aliasingu, ale na razie ich pomaluję. Wystarczy powiedzieć, że na ogół też nie są wolne.

Ponieważ wymaga to renderowania (maksymalnie) całej sceny z perspektywy każdego światła - nawet sześć razy, jeśli jest to światło punktowe, które świeci we wszystkich kierunkach {północ, południe, wschód, zachód, góra, dół}, i musimy ponownie -renderuj mapę cienia za każdym razem, gdy coś się porusza, może to być bardzo kosztowne.

Dlatego gry często koncentrują swój budżet renderowania na najważniejszych światłach na scenie - takich jak kierunkowe światło słoneczne - aby zapewnić dobrze wyglądające cienie. Małe, krótkotrwałe, niewielkie światła, takie jak błysk eksplozji, są często wybaczalne, jeśli trochę przeciekają obok okluderów. Często jest to bardziej smaczne dla graczy niż problem z szybkością klatek na sekundę ze względu na nagły wzrost kosztów renderowania w wyniku dodatkowego renderowania mapy cieni i obliczeń. Zwłaszcza jeśli jest to ruchliwa scena akcji, w której płynność jest ważniejsza niż perfekcja pikseli.

DMGregory
źródło
3
Kolejnym zmarszczeniem jest to, że chociaż nie jest łatwo ustalić, czy źródło światła znajduje się przed czy za powierzchnią, zapobieganie świeceniu powierzchni, gdy jest oświetlone od tyłu, często daje dziwnie wyglądające wyniki.
supercat
Jest to szczególnie prawdziwe w przypadku efektów cząsteczkowych (którym prawdopodobnie jest eksplozja, przynajmniej częściowo), ponieważ cząstki muszą być szczególnie tanie w obsłudze, aby były bardzo przydatne.
Luaan
2
Światła i cząsteczki to dwie różne rzeczy. Cząstka może również „przeciekać” przez przeszkodę, ale z zupełnie innych powodów. Czasami układ cząsteczkowy zawiera również światło, które pomaga sprzedać efekt (pomyśl o ognisku lub roju świetlików), ale światło wewnątrz efektu cząsteczkowego jest nadal tylko światłem, zwykle nie jest to żaden specjalny wariant.
DMGregory
2
Alternatywnym podejściem do cień mapy jest wielkość cienia , które rozwiązuje ten problem aliasingu, ale jest bardziej kosztowny: wymagają specjalnej geometrii zostać wygenerowana (nowej wielokąta na krawędzi sylwetka każdego obiektu dla każdego źródła światła), jak również dodatkowo renderowania przechodzi. Spodziewałbym się jednak, że metoda mapowania jest wystarczająca w większości sytuacji.
DarthFennec
22

Krótko mówiąc, dzieje się tak ze względu na wydajność.

Gdy na ekranie jest światło, domyślnie świeci ono na wszystkie obiekty (zasłonięte lub nie), więc gra musiałaby wykonać dodatkowe obliczenia, aby zobaczyć, na który obiekt ma wpływ.

Łatwiej jest to rozwiązać na obiektach statycznych za pomocą statycznego i wypalonego oświetlenia, ale nie jest to takie samo na dynamicznych światłach, takich jak wybuchy, jak zauważyłeś.

W przypadku pytania bonusowego ray tracing i tanie nie idą w parze w tym samym zdaniu. Jedynym powodem, dla którego ray tracing nie był do tej pory głównym nurtem, jest wydajność. Zakładając, że wszystkie światła używają śledzenia promieni, problem ten zostałby „rozwiązany”, ale kosztem wydajności.

TomTsagk
źródło
6
Czy ray tracing to coś więcej w przypadku filmów CGI niż gier w czasie rzeczywistym?
Akumulacja
21
@Kumulacja To prawda. Renderowanie pojedynczej klatki filmu może potrwać kilka godzin, a gra ma tylko milisekundy.
NobodyNada - Przywróć Monikę
16
To powiedziawszy, gry coraz częściej badają za pomocą raytracingu lub raymarchingu w połączeniu z technikami rasteryzacji, pozwalając rasterizerowi robić to, w czym jest dobry, a promienie robić to, w czym są dobrzy. To nie jest pełne śledzenie promieni każdego piksela, ale nadal możesz uzyskać wspaniałe efekty w ten sposób.
DMGregory
2
@DMGregory Rzeczywiście, w grach takich jak Duke Nukem 3D zastosowano już bardzo uproszczony wariant raytracingu - chociaż nie był on używany do dynamicznego oświetlenia i zdecydowanie nie śledził każdego piksela na ekranie (zwykle robiono to dla każdej kolumny pikseli), a odbicia i przezroczystość nadal były szczególnym przypadkiem, a nie domyślnym. Oprogramowanie do renderowania 3D zawsze grało z podobnym podejściem, to sprzętowe 3D zamknęło tę drogę (do tej pory).
Luaan
@Akumulacja Raytracing występuje na różnych poziomach, więc chociaż gry mogą na szczycie linii strzelać promieniami pierwotnymi, nadal nie wykonują wystarczającej liczby wtórnych odrzuceń lub wielokrotnych odrzuceń na piksel. Więc nawet gdybyś miał raytrace, nadal miałbyś kompromisy wydajnościowe bardzo podobnie. Tak więc główne światła śledzenia zdolności nadal nie oznaczają, że możesz sobie pozwolić na renderowanie wszystkich lamp dodatkowych.
joojaa