GLSL, wszystko w jednym lub wielu programach cieniujących?


17

Robię kilka demonstracji 3D za pomocą OpenGL i zauważyłem, że GLSL jest nieco „ograniczony” (a może to tylko ja?). W każdym razie mam wiele różnych rodzajów materiałów. Niektóre materiały mają barwę otoczenia i rozproszone, niektóre materiały mają mapę okluzji otoczenia, niektóre mają mapę zwierciadlaną i mapę wypukłości itp.

Czy lepiej jest obsługiwać wszystko w jednej parze modułów cieniujących wierzchołki / fragmenty, czy lepiej jest utworzyć wiele modułów cieniujących wierzchołków / fragmentów i wybrać je na podstawie aktualnie wybranego materiału? Jaka jest zwykle strategia cieniowania w OpenGL lub D3D?



To fałszywa dychotomia, że ​​musisz wybrać jedno lub drugie podejście do zarządzania modułami cieniującymi. Przez piętnaście lat w branży nigdy nie pracowałem nad projektem, w którym trzymaliśmy się skrajności, ale zawsze zachowywałem równowagę między dwoma podejściami do zarządzania modułami cieniującymi, wykorzystując każde z nich, w którym było to uzasadnione.
Trevor Powell,

Odpowiedzi:


12

Odpowiedź brzmi: to trochę zależy.

Zasadniczo istnieją dwie szkoły myślenia; małe, optymalne shadery do wszystkiego i do obozu Uber-Shader.

Małe shadery są właśnie takie; zrób jedną rzecz i zrób to dobrze. Uber-shadery albo kontrolują swoją funkcjonalność w czasie wykonywania poprzez uniformy, albo kompilują się w kilka różnych shaderów poprzez makra preprocesora (i / lub generowane źródła shaderów).

Optymalne rozwiązanie nie jest prawdopodobnie żadnym, ale rodzajem hybrydy. Być może kilka uber-shaderów lub uber-shaderów w połączeniu ze specjalistycznymi shaderami w niektórych przypadkach.

Mały moduł cieniujący

Plusy:

  • Prawdopodobnie będzie szybszy / bardziej optymalny
  • Robi dokładnie to, co chcesz
  • Może łatwo robić dziwne, niestandardowe rzeczy

Cons:

  • Łatwo wymyka się spod kontroli, zwłaszcza gdy rośnie liczba funkcji
  • Prawdopodobnie więcej pracy, chyba że masz bardzo małą liczbę shaderów

Uber-shader

Plusy:

  • Wszystko w jednym miejscu
  • Bardziej przyjazny dla artystów (użycie funkcji A z funkcją X po raz pierwszy niekoniecznie wymaga czasu kodera)

Cons:

  • Dłuższe czasy kompilacji modułu cieniującego
  • Mniej optymalne wyniki (szczególnie jeśli mundury są używane do włączania / wyłączania funkcji)
  • Debugowanie / optymalizacja może być trudniejsza

Uber-shaderw tej reprezentacji nie jest dobrą rzeczą :) Proponuję napisać dobrego menedżera shaderów w oparciu o predefiniowane - więc będziemy mieli kod uber-shadera z wieloma #ifdefs, które będą przełączane dla różnych materiałów.
brygadir

2
Dodam, że kolejną zaletą uber-shadera jest to, że zmiana shaderów ma koszt pod względem wydajności, więc jeśli zmieniasz rzadziej, możesz być w stanie poprawić wydajność.
Jherico,
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.