我需要一个没有if-else
语句的高效glsl代码。
目前算法是这样的:
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
,如何做到这一点?
由于
答案 0 :(得分:1)
value = (expression) ? (if true) : (if false);
示例:
BOOL result = value ? YES : NO;
答案 1 :(得分:1)
我不明白你的代码与你提到的浮点模运算符的关系。这样的运算符将浮点数转换为整数;你的代码没有。
如果需要进行此类转换,请使用标准库中的函数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
具有相同的符号。积分
part存储在iptr
指向的位置。
答案 2 :(得分: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