我有这个小代码,可以计算给定 x 的 alpha。很简单:
float a(float x) {
// subdivision = 4 and sizeRatio = 1
x = x * subdivision;
float i = int(x);
return pow((x - i - 0.5) * 2.0, 6.0 / sizeRatio)/5;
}
由于没有那么复杂,我可以在 GeoGebra 中可视化预期结果。根据需要,函数增加到 1,然后在 1 之后减少,对于每个整数都是如此。
即使在 Excel 中,也使用我在 GLSL 代码中使用的相同公式
=POWER((x-FLOOR.MATH(x)-0,5)*2; 6)
:因此,当我运行着色器时,我希望有一个双渐变。问题是,我只有一个梯度,0.5 到 1 之间的梯度,1.0 到 1.5 之间的梯度等等都没有。
造成这种差异的原因是什么?
区别在于 GLSL 的
pow
函数。来自GLSL 330规范:
genType pow (genType x, genType y)
如果 x < 0.
,结果未定义
暂时忽略与
subdivision
的初始乘法,这正是 x - int(x) - 0.5 * 2.0
对于 [0, .5) 中的 x 所发生的情况。
由于图形在 0.5 左右对称,您可以使用绝对函数来解决这个问题。
return pow(abs(fract(x) - 0.5) * 2.0, 6.0 / sizeRatio);
函数
fract
内置于 GLSL 中并计算 x - floor(x)
。