关于遮挡剔除的几个算法尝试

        之前在公司使用DX9做端游引擎,优化性能中涉及到一个算法,就是遮挡剔除。最经典的算法就是使用API中的遮挡查询接口,GPU Gem上面有一篇文章专门讲这个。实话说,这个算法看过好几次,直到今天都没有彻底明白。后来看到有的人评价说这个算法不一定能改进性能,甚至还会导致更低。看到这个我有点底气彻底放弃了,是的,我一直有个观点,就是越简单越好,一旦某个东西很复杂,我就会警惕起来,就会怀疑设计有问题。当然听说DX11下面这个遮挡剔除的接口很好用,有机会可以试一下。

        后来让一个同事去研究了下CE3里面的遮挡剔除算法。CE3里面使用了软件光栅化的方法,大致流程就是,在编辑器中放置一些正交的长方体作为遮挡体,在渲染时,每帧都在CPU上面光栅化这些遮挡体(当然是在分辨率比较小的渲染目标上进行),然后对远处物体进行查询。不过这个同事在我们自己的引擎上实验过后得出的结论是,反而会拉低帧率。我的判断是他没有使用好SSE指令,CE3这种引擎绝不会做没有名头的事。

        既然这个不能用(肯定是我们自己的原因),那就自己创新算法吧。受CE3算法的启发,我就想,何不将光栅化的操作放到GPU上呢。要知道,GPU干这种“粗活”比CPU好上千百倍。我就想到有一个东西可以直接拿来用,都不增加额外的开销,那就是Pre-Z的结果。具体做法就是将上一帧的Pre-Z结果在GPU里面降采样,然后拷贝到CPU,使用这个结果进行查询。

        当然,原理很简单,实际中遇到的技术细节还真不少。首先,由于是使用的上一帧的深度值,那么在镜头快速旋转时,该出现的物体没有出现。还有个问题,物体的包围盒在屏幕上占有一定面积,如果每个像素都检查就太耗性能了,检查几个关键点就行了,可问题又出现了,位于移动物体后面的物体会有时出现有时消失。经过不断改进,总算都解决了。在很多场景中,尤其是主城内,这个算法极大提升了速度。

        在实现中,算法细节还有不少。不过只要方向对了,剩下的就是用时间来磨细节了。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值