Проблемы совместимости на фрагментных шейдерах GLSL

Я обнаружил несколько разных различий между графическими процессорами, обрабатывающими фрагментные шейдеры. Один пример делал pow(x) где x отрицательно. Один графический процессор справился с этим хорошо, в то время как другой вышел из строя

Другая ситуация была где я переписал if() заявления с step() оператор и шейдер работали хорошо. Я обвинял это в пределе ветвления или что-то.

Сейчас я нахожусь в ситуации, когда мой фрагментный шейдер работает на некоторых графических процессорах, а на некоторых нет. Я пытался найти ограничения на GPU/ шейдеры и подобную информацию, но ничего не нашел.

Самый актуальный тест, который работает везде, где я пробовал, за исключением моего GTX 780, находится здесь (Shadertoy)

Я прошу любые указания или ссылку на ограничения шейдеров и наиболее распространенные проблемы совместимости.

1 ответ

Ограничения и спецификации шейдеров зависят от производителя и меняются вместе с версиями архитектуры GPU.

Проще говоря, нет единого способа "управлять ими всеми". Некоторые графические процессоры обрабатывают ветвления по-разному, некоторые лучше, а некоторые хуже. Некоторые графические процессоры допускают отрицательные значения в математических функциях, некоторые нет. Это зависит от используемой архитектуры, версии языка шейдинга и инструкций, которые разрешены в скомпилированной версии шейдера.

Вместо того, чтобы читать и пытаться узнать, что работает на какой карте, лучше попробовать / протестировать шейдер на конкретном графическом процессоре. Это, пожалуй, самое разумное решение в отношении ресурсов, потраченных на "устранение проблемы".

Чтобы ответить непосредственно на вопрос, нет (легко найти) ресурса, который перечисляет всю спецификацию компилятора, используемого в конкретной архитектуре, вы просто следуете советам, которые не выучили, и применяете предложения и замечания, сделанные другими.

Другие вопросы по тегам