查看: 1738|回复: 2

在OSG代码中使用openGL代码

[复制链接]

该用户从未签到

发表于 2014-2-28 16:35:51 | 显示全部楼层 |阅读模式
最近由于导师要求,要我实现调试模式下,在屏幕上显示相关的调试信息,比如我自己设计一个调试函数叫
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-6-18 10:02:28 | 显示全部楼层
http://blog.csdn.net/csxiaoshui/article/list/2。这是CSDN上的一个博客, 主要是 用OpenSceneGraph实现的NeHe OpenGL教程的,也许对你有用。

该用户从未签到

 楼主| 发表于 2014-6-19 09:04:16 | 显示全部楼层
StarShine 发表于 2014-6-18 10:02
http://blog.csdn.net/csxiaoshui/article/list/2。这是CSDN上的一个博客, 主要是 用OpenSceneGraph实现的 ...

他这个只是用OSG实现NEHE用openGL实现的效果,我的要求是在OSG嵌入openGL代码。这两者还是有很大区别的。其实我已经解决了这个问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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