Ogólnie rzecz biorąc, rozgałęzianie w shaderach nie jest dobrym pomysłem. Ale teraz mam moduł cieniujący z warunkiem, który jest stały w odniesieniu do całego zaproszenia do losowania. Wykonywana gałąź jest zawsze taka sama dla jednego wywołania losowania.
Czy tego rodzaju rozgałęzienie jest jeszcze bardziej kosztowne niż posiadanie wielu shaderów bez tych rozgałęzień i przełączanie się między nimi?
performance
shader
nikitablack
źródło
źródło
Odpowiedzi:
Na nowoczesnym sprzęcie, jeśli wszystkie wywołania w grupie podążają tą samą ścieżką, wówczas nieużywana ścieżka nie jest oceniana.
pseudo kodem:
staje się
Gdzie
anyInvocationARB
będzie prawda, jeśli jakiekolwiek wywołanie modułu cieniującego będzie miało wartość true jakocond
(z rozszerzenia opengl ARB_shader_group_vote ).Jeśli war można wyprowadzić z samych mundurów, sterownik może zoptymalizować i ocenić stan przed uruchomieniem renderowania i zastąpić if z goto do właściwej gałęzi. OpenGL ma funkcję zwaną jednolitymi podprogramami, która czyni ją jawną.
źródło