【TA】CapluseAO在Unity里的实现

CapluseAO的实现。

介绍与原理

CapsuleAO是增强人物在场景中融合感的一种手段,减少人物浮空在场景内的感觉。是由顽皮狗工作室在SIGGRAPH 2013中提出。主要方式是用多个胶囊体(Capsules)对动态物体(通常为带蒙皮的模型,比如角色等)进行模拟,以实现非直接光照环境下的动态软影模拟的技术。

该技术的前身是用球谐函数来球形遮挡体的可见性进行模拟。顽皮狗使用胶囊体是因为胶囊体能更好地捕捉细长的几何结构,例如人物的四肢、栏杆等等。这使得 Capsule AO 在处理这些类型的几何体时能产生更准确、更自然的遮蔽效果。

  • 具体技术步骤:
    • 胶囊体近似: 为场景中的每个像素确定一个合适的胶囊体,这个胶囊体的方向和长度取决于周围的几何信息 (例如法线、深度)。
    • 射线相交测试: 从胶囊体端点向场景中发射射线,检查射线是否与场景中的几何体相交。 相交的射线越多,该胶囊体周围的遮蔽就越强。
    • 遮蔽值计算: 基于射线相交的结果,计算最终的 AO 值。 通常会使用一些权重函数来调整不同距离的遮蔽贡献。

可以理解为Capsule AO 是一种改进的 SSAO 技术,它通过使用胶囊体作为几何体近似,简化了,提高了遮蔽的准确性,减少了伪影,并实现了在实时渲染中的高效应用。

具体实现步骤

具体实现流程就是CPU收集胶囊体的信息的数组传递给shader,在传递的时候可以根据距离和权重进行剔除,过远或者不重要的人物的胶囊体就不绘制了。

然后可以打包输出一张RT成为全局参数,在后续特定环境(比如说墙体和地板)shader进行渲染的时候在材质内采样,也可以直接用RenderFeature做在后处理的一个Pass里,可以说是各有利弊。

性能对比