查看: 3771|回复: 10

osg 与 qt5 结合 问题

[复制链接]

该用户从未签到

发表于 2015-3-7 12:13:13 | 显示全部楼层 |阅读模式
问题:   在运行 OSGCookBook 上 用qt 多线程渲染osg场景时,出现错误。如下:
QQ截图20150307120451.png

如果点击忽略选项,则出现的图形 如下:
飞机.png
飞机和字体都有问题。

如果不用多线程,则没有问题。
有没人遇到相同的问题?怎么解决?

osg版本: 3.2.1
qt版本:  5.3.2  

以前一直用的都是qt4.8 则没有问题, 改成qt5 后 就出现上述问题。

该用户从未签到

发表于 2015-8-2 21:15:31 | 显示全部楼层
Qt5 已经和Q4不同 Qt5QT不允许在窗口线程之外渲染OpenGL。

参考:http://forum.openscenegraph.org/viewtopic.php?t=11442

该用户从未签到

 楼主| 发表于 2015-3-7 12:15:29 | 显示全部楼层
#include <QtCore/QtCore>
#include <QtGui/QtGui>
#include <osgDB/ReadFile>
#include <osgGA/TrackballManipulator>
#include <osgViewer/ViewerEventHandlers>
#include <osgViewer/Viewer>
#include <osgQt/GraphicsWindowQt>
#include <QApplication>
#include <osgEarthUtil/EarthManipulator>
#include <osgEarthUtil/ExampleResources>
#include <osgEarthAnnotation/ModelNode>
#include <QVBoxLayout>

using namespace osgEarth;
using namespace osgEarth::Util;
using namespace osgEarth::Annotation;

osg::Camera* createCamera( int x, int y, int w, int h )
{
        osg:isplaySettings* ds = osg::DisplaySettings::instance().get();
        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::Camera> camera = new osg::Camera;
        camera->setGraphicsContext( new osgQt::GraphicsWindowQt(traits.get()) );
        camera->setClearColor( osg::Vec4(0.2, 0.2, 0.6, 1.0) );
        camera->setViewport( new osg::Viewport(0, 0, traits->width, traits->height) );
        camera->setProjectionMatrixAsPerspective(
                30.0f, static_cast<double>(traits->width)/static_cast<double>(traits->height), 1.0f, 10000.0f );
        return camera.release();
}

class RenderThread : public QThread
{
public:
        RenderThread() : QThread(), viewerPtr(0) {}

        virtual ~RenderThread()
        { if (viewerPtr) viewerPtr->setDone(true); wait(); }

        osgViewer::Viewer* viewerPtr;

protected:
        virtual void run()
        {
                if (viewerPtr)
                        viewerPtr->run();
        }
};

class ViewerWidget : public QWidget
{
public:
        ViewerWidget( osg::Camera* camera, osg::Node* scene )
                :   QWidget()
        {
                _viewer.setCamera( camera );
                _viewer.setSceneData( scene );
                _viewer.addEventHandler( new osgViewer::StatsHandler );
                _viewer.setCameraManipulator( new osgGA::TrackballManipulator );
                _viewer.setThreadingModel( osgViewer::Viewer::SingleThreaded );


                //_viewer.setCameraManipulator( new EarthManipulator() ); //
                _viewer.addEventHandler(new osgViewer::StatsHandler);

                osgQt::GraphicsWindowQt* gw = dynamic_cast<osgQt::GraphicsWindowQt*>( camera->getGraphicsContext() );
                if ( gw )
                {
                        QVBoxLayout* layout = new QVBoxLayout;
                        layout->addWidget( gw->getGLWidget() );
                        setLayout( layout );
                }

                _thread.viewerPtr = &_viewer;
                _thread.start();
        }

protected:
        osgViewer::Viewer _viewer;
        RenderThread _thread;
};

int main( int argc, char** argv )
{
        QApplication app( argc, argv );
        osg::Camera* camera = createCamera( 50, 50, 640, 480 );

        //osg::Node *scene=osgDB::readNodeFile("D:/gdal_tiff.earth");
        osg::Node *scene=osgDB::readNodeFile("cessna.osg");
        //osg::Node *scene=osgDB::readNodeFile("D:/MYOsgEarth/osgEarth/tests/gdal_tiff.earth");

        ViewerWidget* widget = new ViewerWidget(camera, scene);
        widget->setGeometry( 100, 100, 800, 600 );
        widget->show();
        return app.exec();

}

该用户从未签到

发表于 2015-3-17 21:22:06 | 显示全部楼层
我新手,请教osg+QT5编译如何设置QT的相关选项啊

该用户从未签到

 楼主| 发表于 2015-3-18 12:03:36 | 显示全部楼层
wangxiaolongit 发表于 2015-3-17 21:22
我新手,请教osg+QT5编译如何设置QT的相关选项啊

你先安装 qt  , 然后在cmake 中 有对应的qt 选项。 勾上即可。

该用户从未签到

发表于 2015-3-18 16:07:11 | 显示全部楼层
class RenderThread : public QThread
{
public:
        RenderThread() : QThread(), viewerPtr(0) {}

        virtual ~RenderThread()
        { if (viewerPtr) viewerPtr->setDone(true); wait(); }

        osgViewer::Viewer* viewerPtr;

protected:
        virtual void run()
        {
                if (viewerPtr)
                        viewerPtr->run();
        }
};
不能这样,QT不允许在窗口线程之外渲染OpenGL。

该用户从未签到

发表于 2015-3-19 14:23:19 | 显示全部楼层
楼主,最后问题是如何解决的啊

该用户从未签到

 楼主| 发表于 2015-3-24 19:41:15 | 显示全部楼层
veiny_yxy 发表于 2015-3-18 16:07
class RenderThread : public QThread
{
public:

为啥  我在qt 4.8 中 没问题呢?   还是 qt5  不行?  如果不行 怎么利用 多线程 渲染?

该用户从未签到

发表于 2015-3-26 21:42:02 | 显示全部楼层
skd_xd 发表于 2015-3-18 12:03
你先安装 qt  , 然后在cmake 中 有对应的qt 选项。 勾上即可。

我用Qt4.8可以编译过,但是用Qt5也可以编译过,但是关于Qt的例子都运行不了,关于Qt的库配置多不对,你有详细的编译设置吗?给我一份让我看看,谢谢了啊

该用户从未签到

发表于 2015-8-5 16:21:26 | 显示全部楼层
是的,qt5 中不能用多线程了,直接用定时器,一样的

该用户从未签到

发表于 2015-8-20 15:43:11 | 显示全部楼层
用Qt4.8.6测试确实有问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表