在unity做一个科技感城市的场景时,给窗户加了一个发光的shader,在电脑端显示正常,但是导出安卓端的时候发现相机移动时,窗口会闪烁。
unity 换闪屏 unity场景闪烁_游戏引擎
在翻找了很多博客和教程后,找到一篇博客并解决了问题。
unity shader在实际项目中出现的问题————安卓机型角色眼镜闪烁的问题(Z-Fighting)
以及这篇博客的参考博客
z-fighting在unity中的解决方式
感谢两位博主,我将相机的near值修改到1时重新导出安卓,闪烁问题就解决了。
通过这个问题,了解了z-fighting与z-buffer概念。
百度百科说明,Z Buffer(Z 缓存),Z-buffering是在为物件进行着色时,执行“隐藏面消除”工作的一项技术,所以隐藏物件背后的部分就不会被显示出来。 在3D环境中每个像素中会利用一组数据资料来定义像素在显示时的纵深度(即Z轴坐标值)。Z Buffer所用的位数越高,则代表该显示卡所提供的物件纵深感也越精确。
unity 换闪屏 unity场景闪烁_技术美术_02
也就是说在这个立体空间维度中,每个物体针对屏幕的每个像素点都有一个深度值,不同深度值表示像素点的远近感,从而在平面上给人以仿佛真实物体的立体感。
原博客中对z-fight说明很清晰,“z-fighting的出现是的不同面上的像素在z-buffer中的值相近,导致前台取像素的时候一会去这个面的,一会取那个面的。改变照相机的near、far属性会涉及到z-buffer中的值的精度。因为在各个平台上z-buffer位数不同,因此改变near和far能给z-buffer中的值的浮点数部分尽量留出空间,消除z-fighting。”
也就是说我的项目中楼房凹进去的部分和窗户模型接近的那个面距离太近了。其实之前项目经常会遇到这个问题,就是用unity简单建模时,比如两个方块叠加时很容易会出现这种闪烁问题。但是这个模型是做好的,而且在电脑端没有出现闪烁,因此忽视了这方面的问题,才了解到了z-buffer位数在不同平台原来还有不同的情况。进行unity的安卓开发与电脑端开发还是有不少问题的,需要时刻有这种跨平台的多维度的考量。