1. 程式人生 > >unity 5.3.5鏤空shader的一個bug

unity 5.3.5鏤空shader的一個bug

現象

在某些android手機上,比如OPPO r7s(adreno 405 GPU),鏤空效果錯誤。該透的地方沒透。主要用於草和樹的渲染。

定位

弄了一個簡單的sample(不用unity),discard指令是可以正確執行的,懷疑可能跟unity的環境有關。 用Intel® Graphics Performance Analyzers debug了一下,shader中的clip函式被翻譯成了一個比較奇怪的樣子。具體來說
clip(col.a - _Cutoff);
會被翻譯成
    u_xlat10_1.x = u_xlat10_0.w + (-_Cutoff);
#ifdef UNITY_ADRENO_ES3
    u_xlatb2 = !!(u_xlat10_1.x<0.0);
#else
    u_xlatb2 = u_xlat10_1.x<0.0;
#endif
    if((int(u_xlatb2) * int(0xffffffffu))!=0){discard;}
在出問題的手機上UNITY_ADRENO_ES3是被定義了的。在unity編輯器中選中shader也可以直接檢視翻譯後的程式碼。 提一句,unity對於shader的跨平臺方案是開發統一使用HLSL語法,針對不同 平臺使用不同的工具進行翻譯[1]。其中gles 2.0,和gles 3.0使用的工具就不一樣。生成的GLSL程式碼也有挺大不同。 既然discard沒有問題,那麼就可能是這個條件分支的問題了。 用sample測試,條件判斷是沒問題的,
u_xlatb2 = !!(u_xlat10_1.x<0.0);
這句不能得到正確的結果。 後來發現這是unity 5.3.5引入的問題[2],並且在5.3.5 p8中解決[3]。 升級版本之前暫時強制渲染API使用opengl es 2.0 ps. 這個問題跟鏤空沒啥關係,而是條件分支的問題,只不過clip會生成條件分支 [1] http://docs.unity3d.com/Manual/SL-ShadingLanguage.html
[2] http://answers.unity3d.com/questions/1227696/spotlight-not-working-on-unity-version-535-and-hig.html
[3] https://unity3d.com/cn/unity/qa/patch-releases/5.3.5p8