Occlusion的一种实现

官方的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的问题


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Occlusion Culling(遮挡剔除)是一种在渲染过程中剔除被遮挡物体的技术,以提高渲染效率。osg中的Occlusion Culling技术实现主要有两种方法:基于场景图的遮挡剔除和基于硬件的遮挡剔除。 1. 基于场景图的遮挡剔除 osg中的场景图(Scene Graph)是一种以节点(Node)和组件(Drawable)为基本单元的数据结构,可以描述一个三维场景的所有物体和其之间的关系。基于场景图的遮挡剔除技术,主要是通过对场景图进行遍历,计算每个节点是否被其他节点遮挡,以决定是否剔除该节点及其子节点的渲染。 具体实现中,可以使用视锥体(View Frustum)和光线追踪(Ray Tracing)等技术,对场景图中的节点进行可见性测试,以确定其是否被遮挡。同时,还可以使用空间分割技术(如八叉树)对场景进行划分,以加快遍历速度。 2. 基于硬件的遮挡剔除 osg中的基于硬件的遮挡剔除技术,主要是通过OpenGL的可编程着色器(Shader)实现。具体实现中,可以使用OpenGL的Geometry Shader来提取出场景中需要进行遮挡剔除的物体的深度值和法向量信息,然后使用OpenGL的Transform Feedback技术将这些信息传递给CPU端进行处理。 同时,还可以使用OpenGL的Occlusion Query技术,对场景中每个物体的可见性进行测试,以确定其是否需要进行渲染。具体实现中,可以使用glBeginQuery和glEndQuery等函数进行测试,并通过glGetQueryObjectiv函数获取测试结果。 总的来说,osg中的Occlusion Culling技术实现是一个较为复杂的过程,需要结合多种技术和算法进行优化,以实现高效的遮挡剔除。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值