某些移动GPU不支持整数模运算。所以我必须使用浮点精度实现模运算。 在Cg标准库中实现fmod如下。
float2 fmod(float2 a, float2 b)
{
float2 c = frac(abs(a/b))*abs(b);
return (a < 0) ? -c : c; /* if ( a < 0 ) c = 0-c */
}
通常“a / b”计算为“a * rcp(b)”。
在某些情况下,由于浮点错误,fmod会返回意外值(例如,当a == b时)。是否有轻量级的方法来克服错误?一个想法是添加像fmod(a + bias,b)这样的偏差,其中0.0 提前致谢。