shader浮点数超过限制范围导致身体显示黑线

在魅族m822q等手机上发现,角色身上的模型会出现黑线

仔细观察发现是高光部分有问题

然后进入shader中,通过不断的调试(隐藏代码的方式。。。)发现在一句代码中出现问题

half3 diffuseTCP2 = (diffColor + specularTerm * specColor.rgb * specColor.a) * light.color * diffuseTermRGB;// + (nl2 <= 0 ? 0 : nl2 * 0.005);

这里如果有specularTerm 的话就必然有问题

后来我看了下具体的计算是

half num = (max(0.32h, lh) * (1.5h + roughness) * d);
	num = num == 0.1h ? 1 : num;
	specularTerm = a / num;

因为num值会非常小,简单计算了下正常值会达到0.0000151.然后a除于他就会得到一个非常大的数,大概在66,225左右。

这时要注意我们用的是half的浮点数精度。这个精度在我们的common.hlsl中是min16float。也就是支持16位的,大概在65,536左右,也就是超过了精度。然后再部分手机上就表现为黑色了。也许是芯片的精度计算不一致。

所以后面的做法是限制specularTerm的范围specularTerm = clamp(specularTerm, 0.0, 100.0);

这样他计算的最终值不会超过half的范围,就能正常显示了

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值