|
在浏览大范围地形数据时,发现在某些较平的视角时(如图1),帧速率会变得很低,分析可能是这个角度下观察时,位移视景体内的地形tile数量最多,导致渲染速度变的很慢。请问有什么方法改善么?使帧速率能够提高。
我想到的方法是,在场景筛选时增加应用远裁剪面筛选,使远处的地形不被加载和渲染,同时开启雾化。代码如下所示,效果如图3。
viewer.getCamera()->setComputeNearFarMode(osg::Camera:O_NOT_COMPUTE_NEAR_FAR);
double fov, aspectRatio, zNear, zFar;
viewer.getCamera()->getProjectionMatrixAsPerspective(fov, aspectRatio, zNear, zFar);
viewer.getCamera()->setProjectionMatrixAsPerspective(fov, aspectRatio, 1, 10000); // 远近剪裁面分别设为1和10000
viewer.getCamera()->setCullingMode(osg::CullSettings::ENABLE_ALL_CULLING); // 开启所有筛选方式
// 开启雾化
osg::Fog* fog = new osg::Fog;
fog->setMode(osg::Fog:INEAR);
fog->setStart(5000);
fog->setEnd(10000);
fog->setColor(osg::Vec4(0.4,0.4,0.4,1));
fog->setFogCoordinateSource(osg::Fog::FRAGMENT_DEPTH);
viewer.getCamera()->getOrCreateStateSet()->setAttributeAndModes(fog);
然而从帧速率上来看,几乎没有任何的改善,请问是我的思路有问题还是具体的代码有问题?还有其他的办法么?
另外一个问题如图2,在启用自动计算远近剪裁面的情况下,由于场景中远点z值非常大,使得自动计算得到的近剪裁面值也较大,导致近处的物体处于近剪裁面以外而被OpenGL管线剪裁掉了。请问,当我的场景中即有很远的物体(如地球、天空球),又有很近的观察对象(人物)时,应该怎样设置远近剪裁面,是使用自动计算功能,还是关掉自动计算而根据实际情况自己实时修改远近剪裁面值?
[ 本帖最后由 indif 于 2009-6-29 15:57 编辑 ] |
|