官方的Occlusion 需要pro版才能用
在商店里找到了个free版也可以用的Occlusion插件
叫IOC
代码遍历了一下
发现原理居然异常简单
手机游戏的话2个脚本就够了
一个是IOCcam这个放在相机上
另一个是IOClod这个脚本有两个作用,如果有多级别模型的话,也可以负责lOD的工作
没有的话,只是负责遮挡剔除
原理是这样的:
创建个摄像机作为主摄像机的子物体
然后关闭他的渲染功能,只作为射线发射器使用
每一帧渲染时,射线相机发送采样数量的射线
射线规则如下:起始点为摄像机位置,范围为比主相机的fov(视角范围稍大)
据说是100到500,效果最佳
至于为什么要比摄像机的fov稍大,则是为了避免出现画面中突然出现物体
还有就是为了防止频闪(类似于状态机中的震荡状态),则需要每个物体记录一个自己的休眠时间,在未被渲染时,超出休眠时间再休眠即可
流程:摄像机发射射线,然后通知被射到的物体,被射到物体执行UnHide显示出来,如果有lod还要根据距离来显示不同的模型,每个显示出来的物体都有一个时间戳和全局的休眠时限,如果超过时限,没有再被通知参与渲染,则关闭渲染
知道原理自己写一个也没多麻烦
感觉他这个还有提升空间
因为效果并不算明显,经测试复杂场景5-10帧的GPU性能节约吧,代价是physica.Simulate 有3-5ms的计算延迟,总体来说还是划算的,因为cpu计算总好过dc增加导致的数据传输浪费的时间和GPu渲染的时间吧
提升的思路:
1.对于小型物体无法正确的被射线击中,可以添加一个类型,单独一个layer的trigger,每当激活该triiger时,把他所管理的小型物体激活
2.每个lod组件不仅负责自己的激活,添加引用,也负责关联物体的激活
3.
补充:
经查找论文资料等,这个办法可能是叫 区间扫描线Z缓冲器算法
经测验,这个实现的问题~
1、对于体积大的物体,效果较好,而体积较小的物体,即使把采样率提高,也还是会出现很明显的物体dump的问题