Autor Wątek: Deferred Rendering vs Forward Rendering - Wydajność  (Przeczytany 1897 razy)

Offline LeftarCode

  • Użytkownik

# Czerwiec 13, 2015, 12:44:24
Witam! Otóż mam problem z Deferred Renderingiem. Przy scenie z jednym światłem i jedną kulką przy Deferred Rendering'u mam 2 razy mniej FPS'ów. Czy deferred zyskuje na wydajności dopiero przy większej ilości świateł ??

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline komorra

  • Użytkownik
    • Blog naszego teamu (o grze Voxelfield)

# Czerwiec 13, 2015, 12:59:58
Tak

Offline Xirdus

  • Redaktor

  • +2
# Czerwiec 13, 2015, 15:24:55
Co znaczy "2 razy mniej"? Spadek z 1000FPS do 500FPS to żaden spadek :)

Offline Mergul

  • Użytkownik

  • +6
# Czerwiec 14, 2015, 00:56:07
Najbardziej dziwi mnie to że wiesz jak działa deferred (zakładam że wiesz skoro napisałeś) i nie znasz odpowiedzi na swoje pytanie

Offline Kitsune

  • Użytkownik


Offline hashedone

  • Użytkownik

# Czerwiec 15, 2015, 14:35:11
Powiem więcej: DS zyskuje na wydajności nie tyle przy większej liczbie świateł, a przy dużo większej liczbie dynamicznych świateł, kiedy nie znamy ich ilości. Jeśli świateł jest zawsze max. 16, możesz sobie je przesłać do shadera w kilku uniformach czy czym tam chcesz i wyrenderować wszystko w jednym przebiegu. W DF masz co najmniej jeden przebieg na geometrię (jeśli nie możesz użyć MRT to w ogóle DS się nie będzie opłacać), i po conajmniej jednym przebiegu per światlo. Także jeśli wiesz że masz do 17 świateł, to masz tu za każdym razem do 16 przebiegów shadera (przy czym dla 16 przebiegów właściwie tylko fragment shader). W przypadku FR masz jeden pełen przebieg. Co innego przy takich 200 światłach. Jeśli nawet pogrupujesz je na potrzeby FR po 16 świateł to to jest pełne 13 przebiegów geometry, vertex i fragment shadera co się robi znacznie wolniejsze niż 1 pełen przebieg wszystkiego i potem 200 przebiegów fragment shadera (i to przy dobrze zaimplementowanym DF nie będą to przebiegi po całym ekranie, tylko tam gdzie światło ma prawo padać).

Offline Dab

  • Redaktor
    • blog

  • +1
# Czerwiec 15, 2015, 15:02:19
Cytuj
Jeśli świateł jest zawsze max. 16, możesz sobie je przesłać do shadera w kilku uniformach czy czym tam chcesz i wyrenderować wszystko w jednym przebiegu [...] Co innego przy takich 200 światłach

Też nie do końca. Przekazanie dowolnej ilości świateł do shadera to od dłuższego czasu nie jest problem (UBO, constant buffers, 1D textures, itd). Problemem jest to, że zapewne nie chcesz przeliczać dla każdego piksela wszystkich 200 świateł, bo zabijesz wydajność a tylko część z nich będzie wpływać na wynik końcowy. I tutaj techniki w rodzaju DS robią optymalizację przeliczając światła lokalne dla danego piksela - zakładając że światła są małe i lokalne, bo w przeciwnym wypadku to będzie antyoptymalizacja (200 full screen passów nie wytrzyma żadne GPU).

Druga zaleta DS to zmniejszenie ilości kombinacji shaderów. W dużym uproszczeniu: jeżeli masz np. 20 rodzajów materiałów i 10 rodzajów świateł to w klasycznym podejściu masz 20 * 10 == 200 shaderów. Przy DS będziesz miał 20 + 10 == 30 shaderów. To jest zysk zarówno dla GPU bo można upchnąć więcej danych używających tego samego shadera, jak i dla programisty bo znacznie upraszcza to zarządzanie renderowaniem.

I powiedziałbym, że ta druga zaleta w realnych grach (a nie syntetycznych scenach z tysiącami mikroskopijnych pointlightów) jest nawet ważniejsza.