Проблемы совместимости на фрагментных шейдерах GLSL
Я обнаружил несколько разных различий между графическими процессорами, обрабатывающими фрагментные шейдеры. Один пример делал pow(x)
где x
отрицательно. Один графический процессор справился с этим хорошо, в то время как другой вышел из строя
Другая ситуация была где я переписал if()
заявления с step()
оператор и шейдер работали хорошо. Я обвинял это в пределе ветвления или что-то.
Сейчас я нахожусь в ситуации, когда мой фрагментный шейдер работает на некоторых графических процессорах, а на некоторых нет. Я пытался найти ограничения на GPU/ шейдеры и подобную информацию, но ничего не нашел.
Самый актуальный тест, который работает везде, где я пробовал, за исключением моего GTX 780, находится здесь (Shadertoy)
Я прошу любые указания или ссылку на ограничения шейдеров и наиболее распространенные проблемы совместимости.
1 ответ
Ограничения и спецификации шейдеров зависят от производителя и меняются вместе с версиями архитектуры GPU.
Проще говоря, нет единого способа "управлять ими всеми". Некоторые графические процессоры обрабатывают ветвления по-разному, некоторые лучше, а некоторые хуже. Некоторые графические процессоры допускают отрицательные значения в математических функциях, некоторые нет. Это зависит от используемой архитектуры, версии языка шейдинга и инструкций, которые разрешены в скомпилированной версии шейдера.
Вместо того, чтобы читать и пытаться узнать, что работает на какой карте, лучше попробовать / протестировать шейдер на конкретном графическом процессоре. Это, пожалуй, самое разумное решение в отношении ресурсов, потраченных на "устранение проблемы".
Чтобы ответить непосредственно на вопрос, нет (легко найти) ресурса, который перечисляет всю спецификацию компилятора, используемого в конкретной архитектуре, вы просто следуете советам, которые не выучили, и применяете предложения и замечания, сделанные другими.