现象
在某些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没有问题,那么就可能是这个条件分支的问题了。