Чи є постійний стан дорожчим, ніж перемикання шейдерів?


14

Взагалі, розгалуження в шейдерах - не дуже гарна ідея. Але зараз у мене є шейдер із умовою, яка є постійною щодо всього розіграшу. Отже гілка, яка виконується, завжди однакова для одного дзвінка.

Невже таке розгалуження все-таки дорожче, ніж наявність декількох шейдерів без цих гілок і перемикання між ними?



Як пояснюється у відповіді на моє запитання, фрагменти групуються в "основи" або "хвилі", і якщо всі фрагменти в такій групі використовують одну і ту ж гілку, виконується лише ця гілка.
Мартін Ендер

А як щодо шейдерів, відмінних від фрагмента?
nikitablack


1
Я підозрюю, що це не дублікат, але його потрібно відредагувати, щоб зрозуміти, що запитують, перш ніж це можна буде визначити. Деякі приклади коду чи пояснення двох варіантів, що порівнюються, допоможуть дуже багато.
трихоплакс

Відповіді:


13

На сучасному обладнанні, якщо всі виклики в групі йдуть за одним і тим же шляхом, невикористаний шлях не оцінюється.

у псевдокоді:

if(cond){
   res = ...
}else{
   res = ...
}

стає

if(anyInvocationARB(cond)){
    res1 = ...
}
if(anyInvocationARB(!cond)){
    res2 = ...
}
res = cond?res1:res2;

Де anyInvocationARBбуде істинно, якщо будь-яке виклик шейдера буде мати істину як cond(від розширення opengl ARB_shader_group_vote ).

Якщо cond можна отримати лише в одностроях, то водій може оптимізувати та оцінити стан перед запуском візуалізації та замінити if на goto на правильну гілку. У OpenGL є функція, яка називається рівномірною підпрограмою, яка робить її явною.


4
Це правда, але це не єдине, що потрібно враховувати для виконання. Графічні процесори все ще статично планують ресурси на шейдер, тому це все ще може мати ресурси, як якщо б ви виконували обидві гілки, що може зашкодити заповненню.
Джон Калсбек
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.