在Camera的类成员函数中,setGraphicsContext()这个函数的主要工作就是设置相机对应图形设备对象。
GraphicsContext就是图形设备设备对象的载体,是任意图形子系统的抽象层接口,它提供了统一的图形设备操作函数,用于实现渲染结果和底层设备的交互,具有平台无关性。
图形设备对象的主要工作就是提供场景渲染结果的载体。这个载体可以显示缓存,进而绘制到一个图形窗口中。
GraphicsContext类是一个不能被实例化的抽象类,通常会使用静态函数createContext,自动根据当前用户环境特征参数traits,构建一个平台无关的图形设备。
相机解决了“如何高效底实现三维向二维窗口的变换”,图形设备器则是确定了相机拍摄内容与某个图形窗口或像素缓存设备的对应关系。
视景器就是高效地讲一个或多个相机组织在一起,并结合场景节点的更新遍历,讲相机在每一帧所拍摄的内容连续的播放出来。
一个视景器创建多个相机查看场景:
osg::Camera* getCamera(int x, int y, int w, int h) {
osg::ref_ptr<osg::Camera> camera = new osg::Camera;
osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
traits->windowDecoration = false;//是否带有标题栏
traits->x = x;
traits->y = y;
traits->width = w;
traits->height = h;
traits->doubleBuffer = true;//是否使用双缓存来管理渲染的刷新
osg::ref_ptr<osg::DisplaySettings> ds = osg::DisplaySettings::instance();
traits->alpha = ds->getMinimumNumAlphaBits();//Alpha缓存
traits->stencil = ds->getMinimumNumStencilBits();
traits->sampleBuffers = ds->getMultiSamples();
traits->samples = ds->getNumMultiSamples();
osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits);
camera->setGraphicsContext(gc);
camera->setViewport(new osg::Viewport(0, 0, w, h));
return camera.release();
}
void createCompositeView() {
osg::ref_ptr<osg::Group> root = new osg::Group;
osg::ref_ptr<osg::Node> cowNode = osgDB::readNodeFile("cow.osgt");
root->addChild(cowNode);
osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();
viewer->addEventHandler(new osgViewer::WindowSizeHandler());
viewer->addEventHandler(new osgViewer::StatsHandler());
viewer->addSlave(getCamera(100, 100, 400, 300), osg::Matrixd::translate(osg::Vec3(1.0, -1.0, 0.0)), osg::Matrixd());
viewer->addSlave(getCamera(505, 100, 400, 300), osg::Matrixd::translate(osg::Vec3(-1.0, -1.0, 0.0)), osg::Matrixd());
viewer->addSlave(getCamera(100, 405, 400, 300), osg::Matrixd::translate(osg::Vec3(1.0, 1.0, 0.0)), osg::Matrixd());
viewer->addSlave(getCamera(505, 405, 400, 300), osg::Matrixd::translate(osg::Vec3(-1.0, 1.0, 0.0)), osg::Matrixd());
viewer->setSceneData(root.get());
viewer->run();
}
aaa