最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

环球微资讯!Float value issue in GLSL

来源:博客园


(资料图片)

Float value issue in GLSL

在编写 Shader 特效的过程中,遇到一个奇怪的问题,表现怪异,逻辑大致如下:out_color += add_color * factor;其怪异表现为,即使在确认 factor 为 0(或无限接近于0.0)时,预期效果应该是无叠加 add_color的,但是实际会有很小的一条线,从逻辑分支即:add_color * 0 != 0这显然是无法理解的。

为解决此问题,进行若干尝试,首先,尝试直接改成 out_color += add_color * 0.0;这样有效,但于解决实际问题无补。若怀疑 factor 可能非 0,做如下尝试:factor = step(0.5, factor);即只要 factor 小于 0.5 就返回 0. 如此尝试后,原问题仍然出现。此问题大概率与 factor 无关。

继续探究 add_color的问题,在前阶段计算中,该值可能非常大,于是考虑进行 clamp,经试验,发现,如下修改可以规避问题出现:add_color = clamp(add_color, 0.0, 100.0);虽然这样可以解决问题,但是似乎是补救之道,而未解决根源。继续回溯,发现 add_color的来源是一个除法计算,其中分母可能为 0,当出现除 0 操作时,其结果数值其实应该是 NA 了,那么后续即使乘 0,也无法保证结果一定是 0 了。

解决方法:在除法计算中为分母增加一个极小 epsilon.

在解决这个问题过程中的意外收获:将 float 的精度声明从 mediump 改成 highp 也可以规避这个问题。

关键词: 这个问题 意外收获 这样可以