透明物体排序
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是第一种方案
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是第一种方案
相关文章推荐
- D3D透明物体后面的物体消失的问题
- 混合和透明物体渲染
- unity3d中让某个物体透明或者半透明
- Alpha混合物体的深度排序[译]
- [备忘]不用排序画透明
- Unity中透明材质物体渲染到RenderTexture的问题
- Alpha混合物体的深度排序
- OpenGL中三位物体的透明实现
- OSG学习笔记22——设置物体透明,再恢复
- 透明物体的渲染
- 透明物体的渲染
- Unity中写GLSL(九)—— 渲染简单的透明物体
- Untiy Native Render Plugin在VR中的绘制(二): 透明排序
- 透明物体的渲染的简单理解
- DirectX学习笔记(八):Direct3D融合技术详解及物体透明效果的实现
- 处理交叉透明物体的渲染
- Alpha混合物体的深度排序[译]
- 关于透明和不透明排序问题
- 绘制透明物体不需要禁用深度测试
- [GEngine]相机角色中间物体透明(BetweenTransparent)