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?


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


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.


+1, ponieważ wspomniałeś, co robi obecna branża.
— Krythic
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.