0

我需要一个没有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呢?

谢谢

4

3 回答 3

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

例子 :

BOOL result = value ? YES : NO; 
于 2013-08-30T06:12:53.150 回答
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。整数部分存储在 指向的位置iptr

于 2013-08-30T06:17:55.863 回答
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
于 2013-08-30T06:45:11.363 回答