查看: 3371|回复: 6

关于osg与qt结合后全屏的问题

[复制链接]

该用户从未签到

发表于 2012-9-11 17:35:30 | 显示全部楼层 |阅读模式
我使用osg与qt结合后,将场景渲染到qt窗口上,
但是立体显示时需要窗口全屏,我不使用qt的全屏,而是将场景渲染到win32的窗口上全屏.
我实现的方法是全屏时将graphiccontext设置成graphiccontextwin32,退出全屏时,将相机的graphiccontext设置成graphiccontextqt,但是这样来回修改设备上下文后,某些纹理好像丢失了。
不知道有没有关于从qt窗口渲染到win32的全屏上的好的方法?

该用户从未签到

发表于 2012-9-12 07:59:53 | 显示全部楼层
什么叫 “从qt窗口渲染到win32的全屏上的好的方法”? qt在windows上 底层 就是win32 .

该用户从未签到

发表于 2012-9-12 11:24:15 | 显示全部楼层
我不使用qt的全屏,而是将场景渲染到win32的窗口上全屏
我不知道您为什么这么考虑,似乎徒增了许多麻烦。您的想法只能通过设置共享DisplayLists来实现,在构建新的Win32窗口的时候,设置Traits的sharedContext为之前Qt窗口的GC

该用户从未签到

 楼主| 发表于 2012-9-12 17:57:39 | 显示全部楼层
array 发表于 2012-9-12 11:24
我不知道您为什么这么考虑,似乎徒增了许多麻烦。您的想法只能通过设置共享DisplayLists来实现,在构建新的 ...

这样做的原因是因为调用qt的showfullscreen函数实现全屏的话,屏幕四周会有一个白色的边框,看起来不是很像全屏的感觉,而且这样做后,主动立体的效果没有出现。因此我就想用了上面的方法。我部分代码如下:
1.全屏部分实现的代码是
void MainWindow:n_actionFullScreen()
        {       
                           //保存qt窗口的gc
                osgViewer::ViewerBase::Windows windows;
               
                _compositeViewerWidget->getWindows(windows);
                _keyBoardEvent->_gw = dynamic_cast<osgQt::GraphicsWindowQt*>(windows.at(0));
       
                unsigned int viewCount=_compositeViewerWidget->getNumViews();
                osg::ref_ptr<osgViewer::View> view = _compositeViewerWidget->getView(viewCount-1);

                osg:isplaySettings* ds =  osg::DisplaySettings::instance().get();
       
                //新建windows窗口的gc
                osg::GraphicsContext::WindowingSystemInterface* wsi = osg::GraphicsContext::getWindowingSystemInterface();
               
                osg::GraphicsContext::ScreenIdentifier si;
                si.readDISPLAY();
                if (si.displayNum<0) si.displayNum = 0;

                unsigned int numScreens = wsi->getNumScreens(si);

                     unsigned int width, height;
                wsi->getScreenResolution(si, width, height);

                if (si.screenNum<0)
                {
                        si.screenNum=0;
                }
                osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits(ds);
                traits->hostName = si.hostName;
                traits->displayNum = si.displayNum;
                traits->screenNum = si.screenNum;
                traits->x = 0;
                traits->y = 0;
                traits->width = width;
                traits->height = height;
                traits->windowDecoration = false;
                traits->doubleBuffer = true;
                traits->sharedContext = 0;
               
                osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());
                gc->realize();
       
                             //重新设置gc
                view->getCamera()->setGraphicsContext(gc.get());

                _keyBoardEvent->_gc = gc;
                                               
                view->getCamera()->setViewport(new osg::Viewport(0,0,traits->width,traits->height));
        }

2.退出全屏时按f键的代码
case(osgGA::GUIEventAdapter::KEYDOWN):
                        {
                                osgViewer::View* view=dynamic_cast<osgViewer::View*>(&aa);
                                if (ea.getKey() == osgGA::GUIEventAdapter::KEY_F)
                                {
                                        OpenThreads::Thread::microSleep(100000);

                                        _gc->close(true);

                                        view->getCamera()->setGraphicsContext(_gw.get());
                                       
                                        view->getCamera()->setViewport(0,0,_gw->getTraits()->width,_gw->getTraits()->height);
               
                                        _comViewWidget->layoutWidgets();

                                        aa.requestRedraw();
                                       
                                }
我渲染的是osgEarth的球,根节点加入了osgEarth中的skynode,skynode是用shader语言写的,我用这种方法实现全屏和退出全屏时,第一次全屏场景渲染的都是正常的,后面退出全屏后再全屏时,skynode好像丢失了,没有渲染出来。
而且控制台出现错误为: error.png

该用户从未签到

 楼主| 发表于 2012-9-12 19:00:30 | 显示全部楼层
tmh1985 发表于 2012-9-12 17:57
这样做的原因是因为调用qt的showfullscreen函数实现全屏的话,屏幕四周会有一个白色的边框,看起来不是很 ...

全屏前.png
这是全屏前渲染的效果,二次全屏后,太阳就渲染不出来了,而且鼠标点击球的时候,纹理会有闪烁的状况

该用户从未签到

 楼主| 发表于 2012-9-13 19:55:25 | 显示全部楼层
这个问题还没有解决,自己顶一下,别沉下去了,呵呵,期待大侠指导啊~~~~

该用户从未签到

发表于 2012-9-24 16:54:11 | 显示全部楼层
您的做法显然欠妥当,这样等于重新建立一个新的OpenGL RC,但是您之前所有的数据都没有在这个环境中编译过,也没有设置共享sharedContext,所以肯定是有问题的

用Qt自己的全屏是没有问题的
调用qt的showfullscreen函数实现全屏的话,屏幕四周会有一个白色的边框
这应该是因为您的布局器的边界margin没有去掉所致
主动立体的效果没有出现
我不认为这与Qt有关
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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