Moja scena zawiera wiele obiektów. (Powiedzmy, że 3 kostki, 1 cylinder, 8 kulek.) Zakładam, że powinienem utworzyć dla każdego moduł cieniujący wierzchołek. Ile programów powinienem mieć?
Alternatywy:
- Jeden program na obiekt
- Jeden program dla wszystkich kostek, a drugi dla wszystkich sfer (przy założeniu, że używają tych samych shaderów)
- Jeden duży program do wszystkiego
Jakie jest właściwe podejście?
opengl
shaders
architecture
Jacks_Gulch
źródło
źródło
Odpowiedzi:
Powinieneś rozważyć programy cieniujące jako podobną część stanu jak tekstury. Zmiana stanu jest kosztowna, więc możesz uciec od łączenia kilku tekstur w jedną, aby uniknąć zmian tekstury; to samo dotyczy shaderów - możesz łączyć kilka shaderów, aby uniknąć zmian stanu.
Podobnie jak łączenie tekstur, łączenie shaderów ma narzut - jeśli renderujesz tylko obszar 16 x 16 pikseli z tekstury 4096 x 4096, nie używasz sprzętu wydajnie. Podobnie, jeśli renderowany obiekt używa tylko 10% kodu w module cieniującym, możliwe jest (a nawet prawdopodobne), że karta graficzna niepotrzebnie oblicza wiele rzeczy.
W skrócie „zależy”.
źródło
Najlepiej, aby wszystko było tak proste, jak to możliwe. Powielanie tego samego modułu cieniującego dla każdego obiektu jest niepotrzebne i szybko się rozdęje. Nie potrzebujesz także jednego gigantycznego modułu cieniującego, który obejmowałby każdy możliwy przypadek użycia, ponieważ powoduje to niepotrzebne koszty ogólne.
Istnieje kilka opinii na temat zarządzania modułami cieniującymi i nie ma „optymalnego” sposobu podejścia do tego. Widziałem nawet niektóre implementacje modułu cieniującego, w których każdy moduł cieniujący jest generowany w locie na podstawie parametrów wyłączonych (np. W silniku Unreal ).
Dla kogoś, kto dopiero zaczyna w tym obszarze, dobrze jest najpierw naszkicować podstawowe shadery. Na przykład mam moduł cieniujący do obiektów bez tekstur, moduł cieniujący z podstawową teksturą i obsługą oświetlenia na piksele itp. Następnie za każdym razem chcę innego efektu, którego nie można uzyskać przy użyciu poprzedniego modułu cieniującego, a następnie „ Stworzę nowy dla nowego efektu.
Celem takiego systemu jest uproszczenie. Właśnie. Trzymać. To. Prosty.
źródło