unity 5.3.5镂空shader的一个bug

来源:互联网 发布:计算机冗余控制软件 编辑:程序博客网 时间:2024/05/13 14:29

现象

在某些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
0 0
原创粉丝点击