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?
Odpowiedzi:
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:
Cons:
Uber-shader
Plusy:
Cons:
źródło
Uber-shader
w 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#ifdef
s, które będą przełączane dla różnych materiałów.