我需要一个没有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
呢?
谢谢
我需要一个没有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
呢?
谢谢
value = (expression) ? (if true) : (if false);
例子 :
BOOL result = value ? YES : NO;
我不明白您的代码与您提到的浮点模运算符有何关系。这样的运算符将浮点数转换为整数;你的代码没有。
如果需要这样的转换,请使用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
。
这是一个可能做你需要的数学表示 - 不使用分支语句
对于 [-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