2013-08-30 3 views
0

Мне нужен эффективный код glsl, который не имеет инструкции if-else. В настоящее время алгоритм таков:Оператор Float modulo, который включает в себя верхнее значение

lowp float a; 
if (a > 1.0) 
    a -= 1.0; 
else if (a < 0.0) 
    a += 1.0; 

Это похоже с оператором с плавающей запятой по модулю:

a = mod(a,1.0); 

только if a == 1, он должен return 1, вместо 0.

Как это сделать без if-else?

Благодаря

ответ

1

Вот математическое представление, которое может делать то, что вам нужно - без разветвлений заявления

Для входа между [-1, 2,0]

a = a + 1 - max(trunc(a), ceil(a)) 

Input Output 
0.3  0.3 
-0.3 0.7 
0.7  0.7 
1.3  0.3 
1.7  0.7 
1  1.0 
+0

Удивительный! Благодаря! – Coolant

1
value = (expression) ? (if true) : (if false); 

пример:

BOOL result = value ? YES : NO; 
+0

Извините за не ясно, я не могу добавить тройная операция, потому что это в основном то же самое с if-else. И if-else неэффективен в glsl. – Coolant

+0

ОК, чем вы пытаетесь #define Вы также можете перейти по этой ссылке .. http://codereview.stackexchange.com/questions/13577/bad-practice-to-have-long-if-else-statements –

1

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

Если такое преобразование желательно, используйте функцию modff из стандартной библиотеки.

#include <math.h> 
float a, dummy; 
... 
a = modff(a, &dummy); 

Если вы не хотите такого преобразования, ответ @devnull является правильным переписывание кода. Если, кроме того, вы хотите «включить верхнее значение» и, например, имеют 1 карту в 1, тогда у вас немного проблемы, так как это включает проверку того, является ли число с плавающей запятой целочисленным или нет. Чтобы сделать это переносимо, я бы предложил снова использовать modff.

СИНТАКСИС

float modff(float x, float *iptr); 

Связь с -lm.

ОПИСАНИЕ

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

+0

Спасибо для того, чтобы дать мне намек на решение. – Coolant

Смежные вопросы