在魅族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的範圍,就能正常顯示了