透明物体带来恼人的问题-Transparent RenderQueue----------Unity------让你的透明物体间歇性的脑残!

当不要脸已成习惯,当山峰也没有了棱角,当招人这么困难的时候,我还是在篇头植入的招聘。

坐标山东青岛市北,招聘日系画师,其他岗位目前公司没有说,有意思的可以入群私聊。


然后再说一下QQ群,山东手游研发聚集地335772557,进群先看公告,要是抱着我要学习的心态进群的话,那你就失望了,因为是个死群。

偶尔心情好的是时候会发个技术链接。

接下来进入正题!!

感谢ZY的测试package!

怎么决定两个透明物体的渲染谁先谁后呢。。

易得证(大家都知道,如果不知道的话,我也当大家都知道了):在unity中(其他引擎我不知道哟),透明物体的Z是一般要关闭写入的。那么谁离相机近谁就先渲染。

这个规则看起来没有什么问题,但是,但是,但是。。。。

①如果两个离的很近的物体,会有ZFighting问题。这是问题一。

②如果两个离的比较近的物体交叠着,相机在运动,比如lookat一点旋转运动,两个物体会在某一时刻分别离相机的距离很近,这就会有跳动。这是问题二。

③离相机近,是物体的pivot里相机近,还是物体的center里相机近。这是问题三。

先说一下问题一。

说起ZFighting,易得证。shader中搞个offset不就好了,于是就有了

Offset - 1 ,- 1
即使两个物体一样的position也可以。但是带来的两个问题就是, 问题二和需要两个shader,一个没有offset一个有offset的,即使两个shader的功能一模一样( 问题A

再说一下问题三和问题二。

这就有的折磨人了,我这里只说一下我的测试结果,测试不一定就是对的。

两个图片一个是pivot在center上的,一个是pivot 偏离的center

  

然后三组


从左往右,第一组是两个相同位置的“Pivot在中心的物体”。

第二组是两相同位置的“一个pivot在中心一个偏离中心的物体”。(物体的中心在世界中心点(0,0,0))

第三组是两个相同位置的“Pivot偏离中心的物体”;

然后我注视世界中心点,旋转相机。


这是三组都分别在相同位置,得到的结果:


对于这种结果,我也不知道改怎么得到疑似结果。毕竟float也是有误差的。


这是中间那组pivot偏离中心的物体在y轴上有0.005f的位移,两边的都分别在相同位置,得到的结果:



然后我们看中心那组的结果。

这是pivot在世界中心(0,0,0)的物体得到的结果:


这是pivot偏离中心的物体在y轴上有0.005f的位移得到的结果:



DynamicBatching我禁用之后也测试了,结果一样。由于两边的两组是第一组和第三组。得到了疑似的结果:这个距离指的是物体中心点到相机的距离,而不是pivot与相机的距离。

这个结果并不是绝对的结果,我只是简单的测试了,测试的内容也比较单一,测试的物体也是一个完全对称的正方形的面片。测试过程也是只用眼睛观测,没有用数据记录说明。这个距离也有可以能是aabb的中心与相机的距离。这个测试就暂停了。所以这个结果并不是一定正确的。


刚才只是梳理的一些问题,接下来才是重要的内容。

方案一:

刚才已经说了一个方案了,shader中加入offset。可以一定性的解决一些问题。问题是:两个shader,并且很多情况不太适合。

方案二:

既然是距离决定排序,那么在透视相机下的排序,显然要比正交相机下复杂。于是那就修改透视相机下的透明物体的距离计算。

正交也好自定义也罢,看项目来吧。


程序大哥的话。。。

cam.transparencySortMode = TransparencySortMode.Orthographic;

缺点:世界上没有完美的解决方案。

方案三:

还是距离,既然相机的Clipping planes near 和far。。。这里就说到这吧,大家应该很明白这两个值的差值越大带来的影响。

方案四:

然后在说一下,一个shader怎么解决这个问题。

每一个物体的vertex都是有ID的,美术在制作过程中会经常有attach的。attach就会影响vertex的ID,比如A去attachB,那么原来A的vertex在新物体中,vertex的ID是从1开始的,那么B就是从A的vertex数量+1开始的。

unity渲染的时候,是从1开始的。我瞎说的。

这里就上做测试的过程了。直接给正确结果吧。

美术阶段,选中地面,attach另一个。resetXform。


方案五:

https://software.intel.com/zh-cn/articles/alternatives-to-using-z-bias-to-fix-z-fighting-issues/

https://blog.csdn.net/tinyhum3d/article/details/7256040

方案六:

这是最重要的方案。google或者百度