Co to jest renderowanie odroczone?

54

Słyszałem o odroczonym renderowaniu i o tym, jak jego użycie może pozwolić na „dużo” świateł w scenie bez ogromnego przebicia wydajności, ale co to jest i (z wysokiego poziomu) w jaki sposób jest realizowane?

Tetrad
źródło

Odpowiedzi:

55

Cechą charakterystyczną odroczonego renderowania jest to, że zasadniczo zmienia on złożoność renderowania sceny z O (geometria * światła) na O (geometria + światła).

Osiąga się to najpierw renderując scenę za pomocą programów cieniujących zaprojektowanych do generowania podstawowych atrybutów, takich jak (przynajmniej) pozycja *, normalny i rozproszony kolor. Inne atrybuty mogą obejmować wartości zwierciadlane na piksel i inne właściwości materiału. Są one przechowywane w pełnoekranowych obiektach renderujących, zwanych zbiorczo jako bufor G.

(*: Warto zauważyć, że programiści częściej decydują się na przechowywanie głębokości i używają jej do rekonstrukcji pozycji, ponieważ dostępność głębokości jest przydatna dla wielu innych efektów ).

Po wygenerowaniu bufora G można obliczyć w pełni oświetlony wynik dla dowolnego piksela na ekranie, rozwiązując BRDF dokładnie raz na piksel na światło. Innymi słowy, jeśli masz 20 oczek, na które wpływa 20 świateł, tradycyjne renderowanie („do przodu”) wymagałoby ponownego renderowania każdej siatki kilka razy, aby zgromadzić wynik działania każdego światła na nią wpływającego. W najgorszym przypadku byłby to jeden ciąg remisowy na siatkę na światło lub 400 łącznych ciągnięć! Dla każdego z tych wywołań nadmiarowo ponownie transformujesz wierzchołki siatki. Istnieje również duża szansa, że ​​będziesz cieniował piksele, na które światło faktycznie nie wpływa lub nie będą widoczne w końcowym wyniku (ponieważ zostaną zasłonięte przez inną geometrię w scenie). Każdy z nich powoduje zmarnowane zasoby GPU.

Porównaj z odroczonym renderowaniem: Aby zapełnić bufor G, musisz renderować siatki tylko raz. Następnie dla każdego światła renderujesz obwiednię, która reprezentuje zakres wpływu światła. W przypadku światła punktowego może to być mała kula, a w przypadku światła kierunkowego byłby to quad pełnoekranowy, ponieważ wpływa to na całą scenę.

Następnie, gdy wykonujesz moduł cieniujący piksele / fragmenty dla ograniczającej objętości tego światła, odczytujesz atrybuty geometrii z odpowiedniej pozycji w teksturach bufora G i używasz tych wartości do ustalenia wyniku oświetlenia. Tylko piksele sceny widoczne w wyniku końcowym są cieniowane i są cieniowane dokładnie raz na światło. To potencjalnie ogromne oszczędności.

Nie jest to jednak pozbawione wad. Jest to paradygmat, który bardzo trudno jest rozszerzyć, aby obsługiwał przezroczystą geometrię (patrz: obieranie głębokości). W rzeczywistości tak trudne, że praktycznie wszystkie odroczone implementacje renderowania wracają do renderowania do przodu dla przezroczystych części sceny. Odroczone renderowanie zużywa również dużą ilość pamięci VRAM i przepustowości bufora ramki, co prowadzi do tego, że programiści starają się sprytnie spakować i skompresować atrybuty bufora G do najmniejszych / możliwie najmniejszych komponentów.

Neverender
źródło
8

Odroczone renderowanie odnosi się również do szerokiego zestawu możliwych ścieżek renderowania, które przechowują wyniki pośrednie w teksturach, a następnie uzupełniają równanie renderowania później, próbkując dane pośrednie.

Bufory geometrii są wczesnym przykładem, w którym scena jest renderowana w szereg buforów, które zawierają np. Pozycję, normalną i podstawową teksturę nieprzezroczystej geometrii. Oświetlenie nie zostało zastosowane, a ostateczny kolor nie jest znany. W kolejnych przejściach światła są renderowane, a bufory geometrii są próbkowane. Oznacza to, że duża liczba świateł może być renderowana przy stałym koszcie liczby świateł widocznych na pikselu ekranu. Tradycyjne renderowanie oceniałoby wszystkie źródła światła dla powierzchni, które były zasłonięte i nigdy nie były widoczne na ekranie.

Istnieje wiele odmian, w tym na przykład najpierw renderowanie informacji o świetle.

Zobacz więcej informacji: http://en.wikipedia.org/wiki/Deferred_shading http://delicious.com/aancsiid/deferred-shading

Vincent Scheib
źródło
-3

Odroczone renderowanie to przetwarzanie w miejscu, w którym znajduje się geomtry, przed wykonaniem drugiego przejścia w celu zaciemnienia wszystkiego. Jest to przydatne, ponieważ zmienia kopleksję na O (piksele * źródła światła), pozwalając na korzystanie ze skomplikowanych scen przy niewielkim wpływie na wydajność.

Wdrożenie jest raczej proste. Pierwsze przejście wymaga renderowania co najmniej odległości, normalności i koloru. Możesz dodać więcej tekstur, aby renderować jak lustrzane i pozycjonować, kosztem pamięci.

Po ich renderowaniu renderujesz niektóre kule, w których unikalne źródło światła znajduje się na środku każdego z nich, dodajesz światło razem, przycinasz wszystko do geometrii w scenie, a na koniec nakładasz efekt opadania.

hellol11
źródło
Nie sądzę, żeby to dodawało nowe odpowiedzi do odpowiedzi. Wygląda to jak przeformułowane fragmenty odpowiedzi Neverendera.
HolyBlackCat
@HolyBlackCat Istnieje kilka ważnych różnic. Po pierwsze, istnieje prawidłowe równanie złożoności, a po drugie, jest ono o wiele bardziej zwięzłe, a jednocześnie wyjaśnia, jak je w rzeczywistości zaimplementować.
hellol11
there's the correct complexity equationPrawdziwe. Ale powiedziałbym, że to drobny szczegół. Możesz zasugerować to jako edycję drugiej odpowiedzi lub zostaw komentarz na ten temat, gdy będziesz mieć wystarczającą reputację. Udzielenie nowej odpowiedzi z tego powodu jest nieco przesadne. it's much more conciseOsobiście nie uważam, że to dobrze. Im więcej przydatnych szczegółów zawiera odpowiedź, tym lepiej, prawda?
HolyBlackCat
1
@HolyBlackCat Do pewnego momentu tak. Osobiście nie lubię przechodzić przez ścianę tekstu, aby uzyskać proste pytanie.
hellol11