一个Mesh的半透明类型
根据渲染管线在渲染半透明时的设定,会提前对所有的Mesh(材质)进行排序,然后依次渲染,即“画家算法”。
不同于特效的半透明类型,角色模型是三维立体并且可以水平旋转的,就算把模型拆分成多个Mesh(材质),利用管线去对所有Mesh排序,也可能得不到理想的半透明效果(比如Mesh有弯曲或穿插等情况)。角色模型有着复杂而不规则的结构和多层嵌套,半透明渲染的排序要求已经达到三角面的精度了。
感觉如果用基于排序的渲染技术去处理半透明,那渲染角色模型这种复杂的半透明效果,还是比较局限。
本文只讨论一个Mesh(材质)的半透明类型,根据半透明最多叠加的层数,总结成下面的几种类型:
预深度写入
这个半透明渲染的技术方案,在Unity官方文档中也有提及。
技术理论:第一个Pass只写入深度,第二个Pass开启深度测试并进行正常渲染。那么离相机较远的片段就会被近的片段通过深度测试给剔除掉,这可以解决半透明的排序问题。
- 优势:解决了排序问题,几乎适用于所有类型的半透明情况
- 劣势:半透明效果是“平面化”,没有真实的立体感
- 下面视频中的例子都是使用预深度写入的方案渲染:半透明的球和人,渲染的效果是“平面化”,没有三维的体积感。半透明的翅膀,当它们互相之间重叠时,渲染出了错误的效果(变成不透明了)。
- 如果使用这个方案渲染三维的角色模型,那劣势的影响将更加明显,模型的半透明效果会缺失三维体积感。并且在有些情况下,结果甚至是错误的。
单层
- 最简单的是只有单层的半透明,不管从什么角度去看,不会有片段重叠的情况,不会有半透明的排序问题。Shader里也不用做什么特殊的处理,只需要一个Pass和关闭深度写入,就能满足半透明效果的需求。
- 角色模型上几乎不会出现只有单层半透明的情况
- 半透明的球体有三维立体感了,半透明的翅膀发生重叠时也是正确的效果。
多层(双层以上)
- 至于多层半透明的情况,除了使用上面提到的预深度方案,如何解决排序问题,还没有想到其它可行的渲染方案。

评论
发表评论