Ile aktywnych shaderów w jednej klatce w grze zwykle powinienem używać? 5 lub więcej jak 100?

20

Ile shaderów jest zwykle aktywnych, jednocześnie w jednej scenie, we współczesnych grach? Wiem, że używanych jest wiele shaderów, a gry przełączają się między nimi w każdej klatce, i często rysuje się obiekty za pomocą shadera:

  1. Narysuj wszystkie obiekty za pomocą modułu cieniującego jeden
  2. Zmień z modułu cieniującego jeden na drugi
  3. Narysuj wszystkie obiekty za pomocą modułu cieniującego dwa

Wiem jednak, że nie jest to takie proste, zwłaszcza z efektami takimi jak efekt blasku dla całej sceny, renderowanie do tekstury itp., Ale myślę, że możemy założyć, że tak działa przez większość czasu, prawda? Podejście „grupuj według modułu cieniującego” jest dobre, ponieważ zmiana cieniowania jest kosztowną operacją.

Z jednej strony nie możesz mieć zbyt wielu shaderów, ponieważ chcesz szybko renderować scenę. Z drugiej strony potrzebujesz wielu różnych shaderów (lub Uber-Shaderów z gałęziami - całkiem podobnych) do skóry, metalu, wody itp.

Ilu (i jakich) różnych shaderów użyłaby teoretyczna, nowoczesna gra detektywistyczna 3D na PC (DirectX 11, jeśli ma to znaczenie)? Byłoby to 5, 20 lub więcej, jak 100 aktywnych shaderów, licząc tylko aktywne, w jakiejś „ramce X”? Wiem, że to nie jest jedna liczba, ale zastanawiam się, jaka skala i czynniki są ważne, biorąc pod uwagę grę na PC.


W mojej przykładowej grze używałbym około 9-11 na klatkę (licz to inaczej, małe shadery lub jeden uber-shader - nie ma teraz znaczenia):

  1. Moduł cieniujący
  2. Cieniowanie oczu (nie za dużo? Ale różnią się)
  3. Metalowy shader
  4. Ground shader
  5. Moduł cieniujący do śniegu / deszczu (jeśli wymagany)
  6. Moduł cieniujący wodę (jeśli woda istnieje w scenie)
  7. Shader Glow (tylko przy włączonych efektach specjalnych)
  8. Moduł cieniujący (lampy uliczne itp.)
  9. Standardowy moduł cieniujący (dla wszystkich innych, tylko standardowe cieniowanie)
  10. Standardowy moduł cieniujący z normalnymi mapami
  11. Moduł cieniujący 2D (do GUI itp.)

Czy to „dużo” czy „mało”? Czy zapomniałem o ważnych shaderach, których potrzebowałbym?

PolGraphic
źródło

Odpowiedzi:

28

To zależy od techniki. W renderowaniu do przodu często masz jeden moduł cieniujący dla każdego rodzaju materiału. W grach AAA korzystających z tej techniki shadery są często generowane z zestawu opcji na materiale, które może ustawić artysta. Może to prowadzić do setek shaderów (1). Ale powiedzmy, że ogólnie liczba shaderów jest rzędu 40

W odroczonym cieniowaniu / renderowaniu często kodujesz rodzaj materiału w buforze G, a później używasz jednego dużego modułu cieniującego, aby poprawnie renderować różne typy materiałów inaczej. Prowadzi to do znacznie mniej, ale bardziej skomplikowanych shaderów. Powiedzmy, że liczba shaderów tutaj jest rzędu 5.

(1) Źródło: Pracowałem dla wykonawcy Crystal Dynamics, gdzie zbudowałem narzędzie do zmniejszenia liczby generowanych shaderów dla Tomb Raider, ponieważ automatyczne generowanie wymykało się spod kontroli;). Celem było zmniejszenie liczby shaderów do 40 lub czegoś w tym stylu.

Roy T.
źródło
2
Dziękuję za odpowiedź - była dość złożona i bogata. Właśnie go głosowałem. Mimo to poczekam kilka dni, zanim będzie to oznaczanie, ponieważ jest to pytanie „otwarte” - być może ktoś jeszcze będzie miał coś więcej do dodania z własnego doświadczenia. Jeszcze raz dziękuję Roy :)
PolGraphic
s / mniej / mniej / ...
błąd
3

Wiem, że chciałeś odpowiedzi na PC. Ale odpowiem za to, co robię w iOS i nie oczekuję, że dostaniesz swój znacznik wyboru.

Wygląda na to, że masz dobry pomysł. Będzie jednak inaczej dla każdej aplikacji. Ostatecznie chodzi o to, aby zrobić to, czego potrzeba, aby uzyskać pożądaną liczbę klatek na sekundę. Na iPhonie mój cel wynosi 60. Nie podoba mi się, aby spadł poniżej 30. Kiedy mam eksplozję kilkuset animowanych cząstek opartych na sprite, spada na 30 na iPhone5 i znacznie niższy na 4. Więc Muszę podejmować decyzje dotyczące zmniejszenia złożoności na niektórych urządzeniach. A czasami ta decyzja wpływa na shadery.

Ale ogólnie nie wpływa to na liczbę shaderów, ale raczej na to, których shaderów używam do zadania opartego na moim celu liczby klatek na sekundę.

Moim zdaniem shadery przy prawidłowym użyciu zwiększają częstotliwość klatek. Mam aplikację, która ma 80 shaderów, ale nie wykorzystuje ich wszystkich na jednej klatce - prawdopodobnie około 10. I kompiluje je w razie potrzeby i odrzuca wszystkie między scenami. A na moim sprzęcie nie widziałem liczby klatek na sekundę. Tylko techniki stosowane w module cieniującym. Ale na pewno myślę, że użycie 2 podobnych shaderów jest lepsze dla liczby klatek na sekundę niż posiadanie bardziej złożonego, który rozgałęzia się.

Mam również moduły cieniujące, które obniżają jakość, jeśli renderowanie jest wolne lub wolniejsze. Używam normalnego mapowania na iPhonie 5, ale zamieniam moduł cieniujący na taki, który nie wykonuje normalnego mapowania na iPhonie 4.

Podoba mi się odpowiedź Roya i zawsze staram się uzyskać wgląd w to, jak powstają „prawdziwe” gry. Ponieważ jestem samoukiem, nigdy nie wiem, czy moim wielkim odkryciem dnia jest po prostu to, jak się to robi ogólnie, czy też kilka kroków za prawdziwymi profesjonalistami.

badweasel
źródło
1
Nie ma problemu z tym, że twoja odpowiedź „jest na iOS”. Mówiłem o PC głównie dlatego, że chcę uniknąć „to zależy od platformy”, krótkie odpowiedzi;) Może twoja odpowiedź nie jest dla mnie w 100%. Ale nadal ma pewne niezależne od platformy wnioski, więc uważam, że jest dobra. Inni członkowie społeczności (korzystający z iOS) mogą uznać to za jeszcze bardziej przydatne, więc dziękuję i
oddajcie
1

Nie można tak naprawdę określić liczby shaderów, które powinieneś lub nie powinieneś mieć, ponieważ zależy to od czynników ograniczających grę, a także od platformy docelowej. W praktyce należy przestrzegać liczby aktywnych shaderów, aby były „tylko tyle, ile faktycznie potrzebujesz”. Czasami oznacza to, że masz tylko garść shaderów (10 lub więcej) na raz, a czasem oznacza to, że masz kilkadziesiąt.

Jednym ze sposobów ograniczenia liczby permutacji pojawiających się w grze jest wdrożenie techniki „ubershader”, dzięki której prawie każdy moduł cieniujący pochodzi z pojedynczego modułu cieniującego, a różnice i specjalne zachowania są zamieniane za pomocą preprocesora. Istnieją oczywiście wyjątki od efektów specjalnych, takich jak głębia ostrości, okluzja otoczenia i tak dalej.

Moje dotychczasowe doświadczenia z grami AAA pokazały, że kilkadziesiąt aktywnych shaderów nie jest nierozsądne.

Evan
źródło