一个Mesh的半透明类型

根据渲染管线在渲染半透明时的设定,会提前对所有的Mesh(材质)进行排序,然后依次渲染,即“画家算法”。

不同于特效的半透明类型,角色模型是三维立体并且可以水平旋转的,就算把模型拆分成多个Mesh(材质),利用管线去对所有Mesh排序,也可能得不到理想的半透明效果(比如Mesh有弯曲或穿插等情况)。角色模型有着复杂而不规则的结构和多层嵌套,半透明渲染的排序要求已经达到三角面的精度了。
感觉如果用基于排序的渲染技术去处理半透明,那渲染角色模型这种复杂的半透明效果,还是比较局限。

本文只讨论一个Mesh(材质)的半透明类型,根据半透明最多叠加的层数,总结成下面的几种类型:

预深度写入

这个半透明渲染的技术方案,在Unity官方文档中也有提及。 技术理论:第一个Pass只写入深度,第二个Pass开启深度测试并进行正常渲染。那么离相机较远的片段就会被近的片段通过深度测试给剔除掉,这可以解决半透明的排序问题。
  • 优势:解决了排序问题,几乎适用于所有类型的半透明情况
  • 劣势:半透明效果是“平面化”,没有真实的立体感

  • 下面视频中的例子都是使用预深度写入的方案渲染:半透明的球和人,渲染的效果是“平面化”,没有三维的体积感。半透明的翅膀,当它们互相之间重叠时,渲染出了错误的效果(变成不透明了)。

  • 如果使用这个方案渲染三维的角色模型,那劣势的影响将更加明显,模型的半透明效果会缺失三维体积感。并且在有些情况下,结果甚至是错误的。
  • 单层

  • 最简单的是只有单层的半透明,不管从什么角度去看,不会有片段重叠的情况,不会有半透明的排序问题。
    Shader里也不用做什么特殊的处理,只需要一个Pass和关闭深度写入,就能满足半透明效果的需求。
  • 角色模型上几乎不会出现只有单层半透明的情况
  • 双层

  • 如果是最多出现两层半透明的情况,有想到一个解决思路,既可以避免排序问题,又能渲染出立体感。
    此方案的思路和预深度有点类似,也是基于两个Pass去实现的。
    技术理论:第一个Pass渲染背面(Cull Front),第二个Pass渲染前面(Cull Back),每个Pass都是同样的着色计算。

  • 半透明的球体有三维立体感了,半透明的翅膀发生重叠时也是正确的效果。


  • 多层(双层以上)

  • 至于多层半透明的情况,除了使用上面提到的预深度方案,如何解决排序问题,还没有想到其它可行的渲染方案。

评论

此博客中的热门博文

Shader - Fabric

Shader - Skin & SSS