- osg的裁剪一直是一个大学问,之前一直以为被遮挡的会被裁剪掉,后面才知道只有在视口之外的才会被裁剪,至于遮挡一直是算法优化的一个重点,如果使用默认的方式则不会裁剪,都是从深度优先渲染,也就是被遮挡的也会渲染,这就极大的消耗了资源,还有一个就是需要知道他有没有被遮挡,如在球背面的,我们就可以不渲染,就有如下的地平线裁剪法;
- 代码解析
osg::Node* item1 = installGeometry1(srs);
mapNode->addChild( item1 );
osg::Node* item2 = installGeometry2(srs);
mapNode->addChild( item2 );
HorizonCullCallback* callback = new HorizonCullCallback();
item1->addCullCallback(callback);
osg::ref_ptr<Horizon> horizon = new Horizon(srs);
osg::Vec3d eye, center, up;
viewer.getCamera()->getViewMatrixAsLookAt(eye, center, up);
horizon->setEye( eye );
horizon->isVisible( item1->getBound() );