2016-09-11 4 views
2

Я работаю над игрой, используя OpenGL ES 2.0Как реализовать эту функцию без ветки if-else? (GLSL)

Я хотел бы удалить ветви в шейдере фрагмента, если это возможно. Но есть функция, которую я не могу улучшить:

float HS(in float p, in float c) { 

    float ap = abs(p); 

    if(ap > (c*1.5)) { 
     return ap - c ; 
    } else { 
     return mod(ap+0.5*c,c)-0.5*c; 
    } 

} 

The c является постоянным в большинстве случаев, если это помогает в этой ситуации. Я использую эту функцию следующим образом:

vec3 op = sign(p1)*vec3(
    HS(p1.x, cc), 
    HS(p1.y, cc), 
    HS(p1.z, cc) 
); 
+0

Хотите повысить эффективность этого кода, или вы хотите удалить это условие? Потому что это две разные вещи. –

+0

Я хотел бы увеличить производительность этого кода, сначала удалив ветки if-else. –

+0

И что, если это не самый эффективный способ улучшить производительность здесь? –

ответ

2

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

vec3 HSvec(in vec3 p, in const float c) 
{ 
    vec3 ap = abs(p); 
    vec3 side1 = ap - c; 
    const float val = 0.5 * c; 
    vec3 side2 = mod(ap + val, vec3(c)) - val; 

    bvec3 tests = greaterThan(ap, vec3(c*1.5)); 
    return mix(side2, side1, vec3(tests)); 
} 

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

Ключ здесь mix. mix выполняет линейную интерполяцию между двумя аргументами на основе третьего. Но так как bool, преобразованный в float, будет ровно 1,0 или 0,0, это действительно просто выбор side1 или side2. И этот выбор определяется результатами компонентной работы greaterThan.

+0

Он работает, но код должен быть: 'lessThan (vec3 (c * 1.5), ap)' –

+1

@IterAtor: Или 'largeThan'; у нас есть это тоже. –

+0

Я до сих пор не слышал о 'bigThan'. Это ответ, который я искал. Не могли бы вы дать мне несколько советов, как этот код должен быть еще более оптимизирован? –