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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章