问题
同样的效果在华为手机是正常的,颜色平滑地渐变、过渡,但在小米(小米11,小米mix2)颜色只有生硬的变化
(有时间补图)
原因
相关计算使用了half。通过一块块注释掉代码的方法发现,有一行式子中,只要加一个值,就会产生色块问题,而这个值的大小是8。将这个值改为0.2(较小的值)就是没有问题的,所以认为是精度问题。
接下来记录学习官方文档得到的知识:
unity官方支持HLSL语言,它使用三种基础精度的浮点数:float, half, fixed。
float
最高的精度,基本是32bit
适合计算世界坐标,纹理坐标,或者涉及比如三角函数、pow、exp等等的复杂计算
half
中等精度,基本是16bit,范围–60000 to +60000,小数点后3位的精度。
适合短的向量,方向,本地空间坐标,hdr颜色
fixed
低精度,基本是11bit,范围-2.0到2.0,1/256的精度
适合普通的颜色,简单的计算
总结
在PC上,全部使用float计算,在mobile上half和fixed才开始起作用。所以要想在手机上跑必须测试。
一般是先用half写,除非位置和texcoord的计算,精度不够再加。
对于NaN这种特殊值,支持Direct3D 10的GPU的行为和写C#脚本的行为是一样的。其他硬件,除以零可能得到NaN,Infinity,零。判断是否是nan使用isnan()函数