您的位置:首页 > 移动开发 > Unity3D

透明物体排序

2017-04-09 18:29 2261 查看
一。透明物体在渲染中一直是一个头疼的存在,除了会增加overdraw引起性能问题外,还经常导致各种渲染错误。所以很多效果都是不支持透明的。但有的时候,美术经常要这种效果。在这里总结下几种常用的解决透明物体渲染错误的办法。

1.基本方法:透明物体都是按照深度进行排序的,所以如果如果是2个物体始终能确定排序顺序,直接调整深度值或者调整renderqueue就可以了。
2.当一个透明物体出现前后面的情况,类似半透的裙子



这种效果 因为裙子是一个整体,他没办法与腿通过简单额深度排序就能解决。只能通过多Pass来解决。
第一遍Pass 只渲染裙子的非透明部分(a>0.8或者其他数值)
第二遍Pass 对于透明部分开启Cull Font 剔除掉前面的部分
第三遍Pass 对于透明部分开启Cull Back 剔除后面的部分。

当然如果是更简单的情况,例如



机甲这种 只是对后面的物体透明,并不需要自身透明,那可以简单的2个Pass搞定
第一个Pass 只渲染深度。
第二个Pass 正常渲染即可。

3 当一个模型出现大量穿插情况 类似发丝 (发梢是通过透明实现的,而非模型)



通过上述几种办法都得不到太好的效果。
解决办法有
1.alpha to coverage
   基于MSAA  其实相当于把他当成非透明物体来渲染。只是最后输出的颜色会乘以alpha值。unity内置 只需shader开启 AlphaToMask On 消耗点主要在MSAA。不过移动端开启MSAA还是比较耗的。
2.depth peeling 和 widget bledn不过这两项技术更篇OIT 需要很多RT 效果也不是很好。就不详细介绍了 感兴趣的可以参考
https://github.com/candycat1992/OIT_Lab
3.离线排序 就是对模型的三角面进行排序(或者对发丝进行排序)但是我试了几次 并没有试出好效果 

 最终幻想13是第一种方案
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  unity 半透明