Qt新渲染底层Scene Graph研究(一)

Qt 5引入的Scene Graph渲染底层替代了Graphics View,基于OpenGL实现高效2D/3D渲染,提供流畅界面效果。它允许开发者利用OpenGL接口定制渲染,并通过批量渲染提升性能,减少了OpenGL状态切换开销。Qt的Scene Graph在Qt 5.1后有显著优化,通过环境变量如QSG_VISUALIZE可进行可视化检测,包括批量渲染、裁剪和全景绘制效果。
摘要由CSDN通过智能技术生成

Qt新渲染底层Scene Graph研究(一)

       Qt 5提出了一个新的渲染底层,以替代Qt4时期的Graphics View,这个渲染底层就是Scene Graph。其实这个底层的作用和Open Scene Graph是差不多的,但是由于是不同的团队进行开发的,所以两者没有必然的联系。Scene Graph主要利用OpenGL ( ES )2的渲染优势,在2D和3D以非常流畅的速度进行渲染,满足日益增长的界面效果需求,同时Scene Graph预留了各种各样的接口,满足大家定义显示和渲染效果的需要。

蒋彩阳原创文章,首发地址:http://blog.csdn.net/gamesdev/article/details/43063219。欢迎同行前来探讨。

       如果大家使用过Qt 5的Qt Quick模块,你会感觉QtQuick的画面渲染速度和效率比Qt 4的GraphicsView来说好很多。当然Qt Graphics View在指定OpenGL渲染context为OpenGL时,差距可能小一些,但也较为明显。这一块儿,主要在渲染部分精简了渲染堆栈,并且充分利用显卡加速,将渲染负担转移到GPU来进行,实现了负载均衡。由于Scene Graph是直接构建在

以下是一个使用 OpenSceneGraphQt 的多线程渲染代码示例: ```cpp #include <QApplication> #include <QThread> #include <osg/Node> #include <osgViewer/Viewer> #include <osgViewer/ViewerEventHandlers> #include <osgGA/TrackballManipulator> #include <osgQt/GraphicsWindowQt> class RenderThread : public QThread { public: RenderThread(osgQt::GraphicsWindowQt* gw) : _gw(gw) {} protected: void run() { osgViewer::Viewer viewer; viewer.setThreadingModel(osgViewer::Viewer::SingleThreaded); viewer.setUpViewInWindow(0, 0, _gw->width(), _gw->height()); viewer.setSceneData(getScene()); viewer.setCameraManipulator(new osgGA::TrackballManipulator); viewer.addEventHandler(new osgViewer::StatsHandler); _gw->setTouchEventsEnabled(true); viewer.setCameraManipulator(new osgGA::TrackballManipulator); viewer.realize(); while (!viewer.done()) { _gw->makeCurrent(); viewer.frame(); _gw->swapBuffers(); } } private: osg::ref_ptr<osg::Node> getScene() { // TODO: create your scene graph here } osgQt::GraphicsWindowQt* _gw; }; int main(int argc, char** argv) { QApplication app(argc, argv); osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits; traits->x = 0; traits->y = 0; traits->width = 800; traits->height = 600; traits->windowDecoration = true; traits->doubleBuffer = true; traits->sharedContext = 0; traits->sampleBuffers = 4; traits->samples = 4; osgQt::GraphicsWindowQt* gw = new osgQt::GraphicsWindowQt(traits.get()); RenderThread thread(gw); thread.start(); gw->show(); gw->raise(); int ret = app.exec(); thread.quit(); thread.wait(); return ret; } ``` 该示例中,`RenderThread` 类是一个继承自 `QThread` 的渲染线程类。在 `run()` 函数中,我们设置了 OSG 的渲染器,并不断地进行场景渲染,直到渲染完成。`getScene()` 函数用于创建场景图。 在 `main()` 函数中,我们创建了一个 `osgQt::GraphicsWindowQt` 对象作为渲染窗口,并将其传递给 `RenderThread`。然后启动线程并显示窗口。在应用程序退出时,我们终止线程并等待其完成。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值