Булева логика на моих фрагментах занимает много VRAM, как я могу избежать этого? - PullRequest
0 голосов
/ 28 февраля 2019

У меня очень простой запрос от GLSL 330:

if (colorOut.r <= 1.0 && colorOut.r > 0.7)
{
    colorOut.r=*color_1.r;
}

У меня более 40 таких сравнений.

Тем не менее, это создает для меня массу проблем, поскольку, как мне сказали, операторы AND, NOT и т. Д. Занимают много видеопамяти, и я разрабатываю плагин для After Effects и людей.у тех, кто их использует, нет сильных графических процессоров (по большей части - я провел опрос, и большинство из них используют мобильную версию графических процессоров среднего уровня).поэтому я решил спросить вас, ребята, есть ли альтернатива использованию AND или вообще, потому что мне сказали, что шейдерам фрагментов вообще не нравится, если они находятся в основной ветке.

Спасибо.

1 Ответ

0 голосов
/ 28 февраля 2019

В сценарии мультиплексирования, подобном вашему, вы можете использовать программирование без ответвлений.Вы можете, например, использовать что-то вроде этого.Булевы операторы являются «приближенными».

colorOut.r = mix(colorOut.r, (colorOut.r*color_1.r), 
    ( clamp(pow(1-colorOut.r, 20), 0, 1)
    * clamp(pow(colorOut.r-0.7, 20), 0, 1) ) );

Обратите внимание, что троичный обычно не вызывает таких проблем, и это должно быть легко для ресурсов, так как не вызывает расходящихся ветвей:

colorOut.r = mix(colorOut.r, (colorOut.r*color_1.r), 
    ( colorOut.r <= 1 && colorOut.r > 0.7 ? 1 : 0 );
...