Оптимизация GLSL: проверьте, находится ли переменная в пределах диапазона - PullRequest
0 голосов
/ 24 октября 2018

В моем шейдере у меня есть переменная b, и мне нужно определить, в каком диапазоне она лежит, и из этого присвоить правильное значение переменной a.Я получил много операторов if:

    float a = const1;

    if (b >= 2.0 && b < 4.0) {
        a = const2;
    } else if (b >= 4.0 && b < 6.0) {
        a = const3;
    } else if (b >= 6.0 && b < 8.0) {
        a = const4;
    } else if (b >= 8.0) {
        a = const5;
    }

Мой вопрос: может ли это привести к проблемам с производительностью (ветвление) и как я могу его оптимизировать?Я посмотрел на функции step и smoothstep, но не нашел хорошего способа сделать это.

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Оказалось, что Jaa-cs answere не подходит для меня, так как я нацеливаюсь на WebGL, который не допускает использование переменных в качестве индексов (если это не индекс цикла).Его решение может отлично работать для других реализаций OpenGL.

Я придумал это решение, используя функции mix и step:

//Outside of main function:
uniform vec3 constArray[5]; // Values are sent in to shader

//Inside main function:
float a = constArray[0];
a = mix(a, constArray[1], step(2.0, b));
a = mix(a, constArray[2], step(4.0, b));
a = mix(a, constArray[3], step(6.0, b));
a = mix(a, constArray[4], step(8.0, b));

Но после некоторого тестирования оно не дало видимой производительностиувеличение.Я наконец-то получил это решение:

float a = constArray[0];

if (b >= 2.0)
    a = constArray[1];
if (b >= 4.0)
    a = constArray[2];
if (b >= 6.0)
    a = constArray[3];
if (b >= 8.0)
    a = constArray[4];

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

0 голосов
/ 24 октября 2018

Вы можете избежать ветвления, создав вид таблицы поиска:

float table[5] = {const1, const2, const3, const4, const5};
float a = table[int(clamp(b, 0.0, 8.0) / 2)];

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...