GeoGebra/Excel与GLSL着色器计算结果不一致问题排查
问题原因分析
你的GLSL代码中,当x * subdivision落在[i, i+0.5)区间时,(x - i - 0.5) * 2.0的结果为负数。虽然从数学逻辑上,负数的偶次幂应为正数,但部分GPU的GLSL实现对负数底数的pow函数处理存在兼容性问题——即便指数是整数,也可能返回NaN(非数值),导致对应区间的alpha值无效(通常会被渲染为透明或0),这就是只有[i+0.5, i+1)区间(此时底数为正)有渐变效果的核心原因。
而GeoGebra和Excel对负数的整数次幂处理严格遵循数学规则,所以能得到符合预期的V型曲线。
修复方案
只需对pow的底数取绝对值,确保传入参数始终为非负数,就能让所有区间的渐变效果正常显示:
float a(float x) { // subdivision = 4 and sizeRatio = 1 x = x * subdivision; float i = floor(x); // 正数场景下和int(x)效果一致,语义更明确 float base = abs((x - i - 0.5) * 2.0); return pow(base, 6.0 / sizeRatio) / 5; }
额外补充:你提到预期函数在每个整数区间内“先递增到1再递减”,但当前公式(包括Excel中的)实际是先递减到0再递增到1的V型曲线。如果要实现先增后减的倒V型,可将返回值调整为1.0 - pow(base, 6.0 / sizeRatio)/5(可根据需求调整系数)。
内容的提问来源于stack exchange,提问作者user19013678
相关产品推荐
相关产品推荐

