osg图形设备接口和视景器

在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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wb175208

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值