Ile programów OpenGL powinienem użyć do renderowania wielu obiektów?

10

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?

Jacks_Gulch
źródło
1
„Zakładam, że powinienem utworzyć moduł cieniujący wierzchołki dla każdego”. Dlaczego to zakładasz? Moduł cieniujący wierzchołki przekształci wierzchołki zgodnie z modelem i matrycami widoków i prawie zawsze chcesz, aby był taki sam dla wszystkich.
usm

Odpowiedzi:

8

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”.

Jari Komppa
źródło
4
Ponadto w wielu przypadkach można uciec tylko za pomocą jednego modułu cieniującego. Różnice dotyczą tylko mundurów, które przekazujesz do modułu cieniującego, takich jak kolor, tekstura, normalne mapy itp.
rioki,
Tak, na przykład możesz mieć moduł cieniujący „Scaly”, który wytwarza fragmenty, które wyglądają na łuszczące się, i który działa w taki sposób (większość shaderów robi ...), że możesz renderować wszystkie 3 kostki, 1 cylinder i 8 kulek za pomocą tego jeden moduł cieniujący (oczywiście z odpowiednimi prymitywami geometrii). Rozsądnym zestawem mundurów może być tutaj wartość wektora określająca kolor, a może kilka skalarów lub coś, co wpływa na to, jak „łuskowaty” lub „błyszczący” będzie efekt wizualny. Następnie masz jeden moduł cieniujący i zmieniasz sposób kolorowania modułu cieniującego, zmieniając mundury między rysunkami poszczególnych geometrii.
Steven Lu,
5

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.

Anko
źródło
+1, ponieważ wspomniałeś, co robi obecna branża.
Krythic