|
按我的理解,对一个osg::Camera的节点调用了setRenderOrder(osg::Camera::PRE_RENDER);之后,就会先于主Camera绘制,最终结果是此节点不会显示在屏幕上。我写了一个简单的工程,用于测试此推论,结果的确如此。加与不加这一语句,该节点就会显示或不显示。大概的代码如下:
osg::Camera * earth_node = new osg::Camera;
earth_node->setGraphicsContext(windows[0]);
earth_node->setViewport(0, 0, windows[0]->getTraits()->width, windows[0]->getTraits()->height);
osg::Node * earth = osgDB::readNodeFile("E:\\EarthView\\earth.ive");
earth_node->addChild( earth ); osg::EllipsoidModel em;
double x, y, z;
em.convertLatLongHeightToXYZ(cen_lat, cen_lon, cen_hgt, x, y, z);
earth_node->setViewMatrixAsLookAt(osg::Vec3d(x, y, z), osg::Vec3d(0, 0, 0), osg::Vec3d(0, 0, 1)); earth_node->setProjectionMatrixAsPerspective(30, (double)(windows[0]->getTraits()->width) / windows[0]->getTraits()->height, 1000, 50000000);
earth_node->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
earth_node->setRenderOrder(osg::Camera::PRE_RENDER); // ***** 此句关键,让本节点只用于 RTT,其本身并不显示
earth_node->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
但问题是:当我把这段代码加入到当前一个大工程中之后,本想把此节点只用于RTT,然后作淡入淡出的效果,没想到该earth_node始终显示在屏幕上(始终看到earth_node和RTT的结果),无法消失。不知哪位高手知道原因?难道有其它什么函数调用,会让 earth_node->setRenderOrder(osg::Camera::PRE_RENDER) 的设置无效吗?我在osg::Camera::PRE_RENDER之后再试过加各种不同的整数,如0xf0000000,0x7fffffff等等,earth_node始终显示在屏幕上。哪位能帮帮忙,就算一点提示也好,在此先谢过啦。 |
|