2018-08-12
点云渲染是非常简单的事情。因为我们只需要处理顶点,光照都不需要考虑。但是,当点云的数量很大,达到千万、亿级别时,事情就变得困难了。FPS低于10,就根本没有办法做什么交互了,甚至显存根本装不下需要渲染的对象,或者顶点数量超过了显卡的能力上限。所以,我们需要优化这个过程。点云显示最大的性能瓶颈就是光栅化,顶点的数量是最大的问题所在。针对此问题,我们一般由两种优化措施来解决问题:LOD,延迟渲染。
LOD能够直接减少顶点,我们可以提前制作一份化简的模型(点云),即使顶点数量下降一个甚至两个数量级,对于我们观察它的外形来讲,都不会造成太大的失真,我们可以接受。这直接让”不能渲染“变成了”可能渲染“,这一步尤其重要。我们也可以通过代码随时化简原始稠密点云。OSG直接支持LOD,有一个LOD类,它是一个特殊的Group节点,对于一个对象,假设我们要使用4级LOD,那么就给它添加四个子节点,分别设置生效的距离。
osg::ref_ptr<osg::Node> lod1 = loadOBJ("bunny.ply"); osg::ref_ptr<osg::Node> lod2 = loadOBJ("bunny2.ply"); osg::ref_ptr<osg::Node> lod3 = loadOBJ("bunny3.ply"); osg::ref_ptr<osg::Node> lod4 = loadOBJ("bunny4.ply"); osg::ref_ptr<osg::LOD> lod = new osg::LOD(); lod->ad