在魅族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的范围,就能正常显示了