查看: 1924|回复: 12

DisplaySetting::instance()的设置是否会被GraphicsContext覆盖?

[复制链接]

该用户从未签到

发表于 2010-4-20 10:18:21 | 显示全部楼层 |阅读模式
先设置traits->quadBufferStereo = true;
再设置osg:isplaySettings::instance()->setStereoMode( osg::DisplaySettings:UAD_BUFFER );
OSG的渲染线程直接退出了?请问这是什么原因呢?
instance()是单件么?
下面是渲染线程:
while(!viewer->done())
    {
        osg->reFrameUpdate();
        viewer->frame();
        osg->PostFrameUpdate();
        //Sleep(10);         // Use this command if you need to allow other processes to have cpu time
    }

该用户从未签到

 楼主| 发表于 2010-4-20 10:22:08 | 显示全部楼层
对了,主要问题还有:
在osg:isplaySetting::instance()中设置的诸如EyeSeparation的值是否会在设置GraphicsContext后被覆盖呢?

该用户从未签到

 楼主| 发表于 2010-4-20 10:27:00 | 显示全部楼层
“修改viewer->getDisplaySettings()试一试”
viewer->getDisplaySettings()和osg:isplaySetting::instance()有什么区别呢?

该用户从未签到

发表于 2010-4-20 12:27:16 | 显示全部楼层
再设置osg: DisplaySettings::instance()->setStereoMode( osg:isplaySettings:: QUAD_BUFFER
请确认您的显卡是否支持四方体缓冲立体?一般只有NVidia Quadro系列,Wildcat系列等几款显卡可以支持

诸如EyeSeparation的值是否会在设置GraphicsContext后被覆盖呢
不会

osg:: DisplaySetting::instance()是单态实例,也就是说,一个程序中只能有一个DisplaySettings::instance()对象;而viewer->getDisplaySettings()一般都直接使用与instance同一个实例,不过也可以自己设置一个独立的

该用户从未签到

 楼主| 发表于 2010-4-20 14:54:48 | 显示全部楼层
谢谢管理员的答复了~
我使用glGetBooleanv(GL_BACK_LEFT,&suport)来查询是否有后左缓冲,但是好像glGetBooleanv没有对suport进行任何修改
实验了下GL_DOUBLEBUFFER也没有对suport进行修改~
感觉好像glGetBooleanv被重载了还是被什么东西截获了一样,请问是什么原因啊?

该用户从未签到

发表于 2010-4-20 15:13:48 | 显示全部楼层
glGetBooleanv可能是不合适的,我个人也不确切知道有没有现成的查询函数;不过根据OpenGL的解释,给glReadBuffer指定一个不存在的缓存(例如GL_BACK_LEFT),会导致一个错误。也许您可以利用这一点来进行查询

此外,请注意一定保证您自己的OpenGL设备在执行指令时有效;您的“没有对suport进行修改”的问题似乎和这个有关

该用户从未签到

 楼主| 发表于 2010-4-20 15:13:48 | 显示全部楼层
The osgteapot example provides an example of integrating OpenGL code
into the OSG.  You could also try using a camera post draw callback.
You'll need to insulate your own OpenGL state management from the OSG
and visa versa.
我只是查询下,应该不需要隔离吧,什么原因哦

该用户从未签到

 楼主| 发表于 2010-4-20 16:28:03 | 显示全部楼层
哦,知道了!再次谢谢!
还有个问题就是:instance()单态实例会析构吗?比如使用instance()->setNumMultiSample(16)创建了一个渲染窗口,窗口渲染完毕后结束渲染线程并删除viewer实例,之后再使用instance()->setNumMultiSample(8)创建一个渲染窗口,发现并没有开启多重采样,倒是让窗口变为全屏的了~
请问这是什么原因?
我的想法是instance中的变量如samples在viewer被删除后还是16,而窗口设备已经被各式化为samples=16,而再次设置已经被格式化为samples=16的窗口设备为samples=8会导致pixleformat可能不匹配,引起一系列对这个问题的处理,最后窗口变全屏了...
而osg例子里边的osgmfc使用的是多文档,每次关闭窗口的时候viewer自动被删除,窗口设备也同时被删除,再次打开新窗口的时候,窗口设备是未被设置过的~所以不会出问题...
请问是这样的原因吗?
请管理员大大在帮忙指点下!

该用户从未签到

发表于 2010-4-20 16:43:34 | 显示全部楼层
instance()单态实例会析构吗
不会在程序运行周期内析构

窗口设备已经被各式化为samples=16
如果您真的已经完全删除了viewer并释放了相关的所有对象,那么不会有这种情况发生。您的实验方法可能存在问题

该用户从未签到

 楼主| 发表于 2010-4-20 16:53:10 | 显示全部楼层
traits->setInheritedWindowPixelFormat有关系吗?
osg::ref_ptr<osg::Referenced> windata = new osgViewer::GraphicsWindowWin32::WindowData(m_hWnd);
m_hWnd这个窗口我没关闭
class cOSG{
private:
    osgViewer::Viewer* mViewer;
}
cOSG* mOSG = new cOSG();
delete mOSG;
mOSG = NULL;
请问这样mViewer算是被完全删除并释放了吗?

该用户从未签到

 楼主| 发表于 2010-4-20 16:56:03 | 显示全部楼层
cOSG::~cOSG()
{
    mViewer->setDone(true);
    Sleep(1000);
    mViewer->stopThreading();

    delete mViewer;
}

该用户从未签到

 楼主| 发表于 2010-4-20 16:57:50 | 显示全部楼层
请问mViewer的地址被其他指针指了也不行吗?

该用户从未签到

 楼主| 发表于 2010-4-20 17:00:07 | 显示全部楼层
谢谢管理员大大,我用ref_ptr试试
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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