查看: 1405|回复: 2

如何在OSG嵌入openGL代码

[复制链接]

该用户从未签到

发表于 2014-2-28 16:41:50 | 显示全部楼层 |阅读模式
最近由于导师要求,要我实现调试模式下,在屏幕上显示相关的调试信息,比如我自己设计一个调试函数叫
osg_debug()
{
//openGL code
}
当单步调试到这个语句后,并执行完这条语句时,屏幕就会显示openGL代码执行结果。由于我尝试过用openGL代码去实现这一效果,证明能够实现。只要在调试的语句中添加一句glFinish().即可强制GPU绘制并显示。但是在OSG中,由于我们知道OSG每一帧都需要做五件事advance(),事件遍历,,等等,最后当然是渲染遍历。可是在调试的时候这些是不会执行的,因为现在程序处于调试状态。于是我想到了在OSG中嵌套openGL代码来解决这个问题。于是我在网上搜了下相关的论坛,只找到一个和这个相关的。不过人家是在自己渲染引擎中嵌套OSG代码。具体操作代码如下,我也是在网上copy过来的!
                sceneViewer=new osgUtil::SceneView;
                frameStamp=new osg::FrameStamp;
                sceneData=new osg::Group;
                sceneData->addChild(osgDB::readNodeFile("cow.osg"));
                  //openGL code
                  glPushAttrib(GL_ALL_ATTRIB_BITS);
                  glMatrixMode(GL_PROJECTION);
                  glPushMatrix();
                  glMatrixMode(GL_TEXTURE);
                  glPushMatrix();
                  glMatrixMode(GL_MODELVIEW);
                  glPushMatrix();

                  //drawing in your own openGL code
                 
                  glMatrixMode(GL_PROJECTION);
                  glPopMatrix();
                  glMatrixMode(GL_TEXTURE);
                  glPopMatrix();
                  glMatrixMode(GL_MODELVIEW);
                  glPopMatrix();
                  glPopAttrib();        
                 GLint viewParams[4];
                 glGetIntegerv( GL_VIEWPORT, viewParams );
                 sceneViewer->setViewport( viewParams[0], viewParams[1], viewParams[2], viewParams[3]);
                 GLfloat glMat[16];
                 osg::Matrix osgMat;
                  glGetFloatv( GL_PROJECTION_MATRIX, glMat);
                  osgMat.set( glMat );
                  sceneViewer->getProjectionMatrix().set( osgMat );
                  glGetFloatv( GL_MODELVIEW_MATRIX, glMat );
                   osgMat.set( glMat );
                  sceneViewer->getViewMatrix().set( osgMat );
                  double time_since_start = timer.delta_s( start_tick, timer.tick() );
                  frameStamp->setReferenceTime( time_since_start);
                  frameStamp->setFrameNumber( frameNumber++ );
                  sceneViewer->setFrameStamp( frameStamp.get());
// Lastly, you need to make the actual calls to the SceneView object:
              sceneViewer->update ();
              sceneViewer->cull ();
              sceneViewer->draw ();
以上代码是从论坛上copy下来的。可是显然看的出来这里没有GraphicContex。我不知道怎么好好利用人家这个代码。我也看过Array的cookbook上看到他说过这句话,我们有基本可以有三种方式在OSG中使用openGl命令。第一种大家都知道那就是osg:rawable callback中写。第二种是使用setUpInWindow.Array只是提了一下,没有具体说怎么做。第三种是GraphicContex. 可是我试了第三种方法,就是没有任何反应,我不明白哪出了问题。因为按照OSG的原理,得到图形上下文(makeCurrent,releaseContex()).然后保存当前OSG所有的属性。然后写openGL代码是可以的。可是我的尝试表明没有任何结果出来。万般无奈。只希望一起学习的朋友帮助下。就是怎么在OSG中使用openGL代码。当然我需要的是除了使用osg::Drawable callback方法以外其他的方法!

该用户从未签到

发表于 2014-3-14 03:48:42 | 显示全部楼层
您这段代码粗略看来貌似是要在OpenGL环境下嵌入OSG的场景图核心库,但是这样会丢失很多OSG原生的功能,比如多线程渲染,漫游器等等,基本上除非有特殊需求,否则不推荐这么做。
我也不清楚您目前的需求究竟卡在哪里,在我看来您的需求完全可以在自定义Drawable中实现,或者也可以考虑通过GraphicsOperation等

该用户从未签到

 楼主| 发表于 2014-3-14 09:21:03 | 显示全部楼层
array 发表于 2014-3-14 03:48
您这段代码粗略看来貌似是要在OpenGL环境下嵌入OSG的场景图核心库,但是这样会丢失很多OSG原生的功能,比如 ...

因为我调试的时候才会让这些语句生效,程序正在运行的时候注释掉这些语句。所以说,暂时不需要OSG带的加快运算的速度的方法。我不在drawable中写这些代码,是因为我调试的时候这么做,需要OSG又走一遍它的基本工作流程,然后最终才想GPU发送绘制指令。vsIDE单步调试的时候让OSG重新走一遍虽然也可以,但是得往场景中添加一个节点。但是我其实就是想尝试下OSG下,获得OSG的GraphicContex,然后调用其makeCurrent方法得到设备上下文。然后调用openGL代码进行操作。当然在不知道OSG当前状态的情况最好把OSG状态压栈。不知道Array您明白我的意思不。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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