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:
- Narysuj wszystkie obiekty za pomocą modułu cieniującego jeden
- Zmień z modułu cieniującego jeden na drugi
- 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):
- Moduł cieniujący
- Cieniowanie oczu (nie za dużo? Ale różnią się)
- Metalowy shader
- Ground shader
- Moduł cieniujący do śniegu / deszczu (jeśli wymagany)
- Moduł cieniujący wodę (jeśli woda istnieje w scenie)
- Shader Glow (tylko przy włączonych efektach specjalnych)
- Moduł cieniujący (lampy uliczne itp.)
- Standardowy moduł cieniujący (dla wszystkich innych, tylko standardowe cieniowanie)
- Standardowy moduł cieniujący z normalnymi mapami
- 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?
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.
źródło
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.
źródło