GeoGebra/Excel 的结果和我的 GLSL 着色器上的结果不一样

问题描述 投票:0回答:1

我有这个小代码,可以计算给定 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 之后减少,对于每个整数都是如此。

enter image description here

即使在 Excel 中,也使用我在 GLSL 代码中使用的相同公式

=POWER((x-FLOOR.MATH(x)-0,5)*2; 6)

enter image description here

因此,当我运行着色器时,我希望有一个双渐变。问题是,我只有一个梯度,0.5 到 1 之间的梯度,1.0 到 1.5 之间的梯度等等都没有。

造成这种差异的原因是什么?

enter image description here

glsl shader alpha
1个回答
0
投票

区别在于 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)

© www.soinside.com 2019 - 2024. All rights reserved.