查看: 3222|回复: 8

关于osg和qt结合后显示quad buffer立体显示的问题

[复制链接]

该用户从未签到

发表于 2012-10-19 11:44:12 | 显示全部楼层 |阅读模式
我使用qt与osg结合,qt作为界面,在win7下,立体显示的模式设置成为quad buffer时没有立体效果,设置成水平分割时,可以显示立体。
请问下有哪位大侠遇到过这种情况?急等解决。

该用户从未签到

发表于 2012-10-19 12:02:05 | 显示全部楼层
貌似没有相关的实现,QT中默认的就是左右眼,可以参照osgViewer::View中自己进行实现
void QGLFormat::setStereo ( bool enable )
If enable is true enables stereo buffering; otherwise disables stereo buffering.
Stereo buffering is disabled by default.
Stereo buffering provides extra color buffers to generate left-eye and right-eye images.

该用户从未签到

发表于 2012-10-19 16:19:33 | 显示全部楼层
我写GraphicsWindowQ的时候,应该还不支持QuadBuffer。现在是否有支持我就不太清楚了~~

该用户从未签到

 楼主| 发表于 2012-10-22 09:37:42 | 显示全部楼层
array 发表于 2012-10-19 16:19
我写GraphicsWindowQ的时候,应该还不支持QuadBuffer。现在是否有支持我就不太清楚了~~

请问下array,用qt做界面,想实现quad buffer的话,可以提供一下解决的思路吗?

该用户从未签到

发表于 2012-10-29 09:36:49 | 显示全部楼层
Qt没有用WGL来实现窗口的初始化,它的设备建立过程被自己包装起来了,所以如果Qt没有提供直接的QuadBuffer接口就没办法直接用起来。有一种变通的方法是先建立一个普通的Win32窗口来渲染OSG,然后setParent到Qt的父窗口上,这个我做过没什么问题,并且可以直接实现QuadBuffer

该用户从未签到

 楼主| 发表于 2012-10-29 16:56:01 | 显示全部楼层
array 发表于 2012-10-29 09:36
Qt没有用WGL来实现窗口的初始化,它的设备建立过程被自己包装起来了,所以如果Qt没有提供直接的QuadBuffer接 ...

请问下setParent是什么下面的方法?您的意思是不是建立一个独立于qt的win32窗口,然后在窗口模式下把它的位置与qt界面绑定,全屏模式就用win32本身的全屏?

该用户从未签到

发表于 2012-10-30 10:36:33 | 显示全部楼层
SetParent是Windows的函数了,您可以直接设置一个HWND的父窗口,然后两者会无缝地结合起来,无论上层是什么GUI

该用户从未签到

发表于 2012-10-30 10:50:11 | 显示全部楼层
  1.         osgViewer::ViewerBase::Windows windows;
  2.         viewer.getWindows(windows);
  3.         osgViewer::GraphicsWindowWin32* win = dynamic_cast<osgViewer::GraphicsWindowWin32*>(windows[0]);
  4.         ::SetParent(win->getHWND(), widget.winId());
复制代码

该用户从未签到

发表于 2014-6-8 19:33:10 | 显示全部楼层
本帖最后由 xingshujun 于 2014-6-9 16:22 编辑

根据上面的思路写了一个四缓冲写了一个测试的小程序
已知问题:
必须将程序开始时设置为四缓冲模式,运行过程中只能关闭立体,开启四缓冲立体;

其他格式的立体无法开启,例如红蓝,左右格式等

窗口过大时,会无立体效果

看大家有什么方法,可以自由切换成其他立体格式


主要代码如下
  1. QuadBufferViewerWidget::QuadBufferViewerWidget(ref_ptr<Node> root,QWidget *parent )
  2.         : QWidget(parent),_root(root)
  3. {
  4.         ui.setupUi(this);

  5.         _ds = osg::DisplaySettings::instance();
  6.         _ds->setStereo(true);
  7.         _ds->setStereoMode(osg::DisplaySettings::QUAD_BUFFER);

  8.         _viewer.setSceneData( root );
  9.         _viewer.setUpViewOnSingleScreen(0);
  10.         _viewer.setCameraManipulator( new osgGA::TrackballManipulator );
  11.         _viewer.realize();
  12.         _viewer.getWindows(_windows);

  13.         _pWin  =  dynamic_cast<osgViewer::GraphicsWindowWin32*>(_windows[0]);
  14.         _pWin ->  setWindowRectangleImplementation(0,0,width(),height());

  15.         _isFirstFrame  = true ;

  16.         startTimer(20);
  17. }


  18. void QuadBufferViewerWidget::timerEvent( QTimerEvent *event )
  19. {
  20.         if (_isFirstFrame == true)
  21.         {

  22.                 ::SetParent(_pWin->getHWND(),winId());

  23.                 _viewer.frame();

  24.                 _ds->setStereo(false);

  25.                 _isFirstFrame = false ;

  26.         }

  27.         _viewer.frame();
  28. }

  29. void QuadBufferViewerWidget::resizeEvent( QResizeEvent * event )
  30. {
  31.         _pWin->setWindowRectangleImplementation(0,0,width(),height());
  32. }


  33. void QuadBufferViewerWidget::setStereoCommon()
  34. {
  35.         _ds->setStereo(false);
  36. }
  37. void QuadBufferViewerWidget::setStereoQuad()
  38. {
  39.         _ds->setStereo(true);

  40.         _ds->setStereoMode(osg::DisplaySettings::QUAD_BUFFER);
  41. }



复制代码



下载地址:
http://pan.baidu.com/s/1dDIN6GL
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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