JacaYang 发表于 2014-2-28 16:35:51

在OSG代码中使用openGL代码

最近由于导师要求,要我实现调试模式下,在屏幕上显示相关的调试信息,比如我自己设计一个调试函数叫
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;
               glGetIntegerv( GL_VIEWPORT, viewParams );
               sceneViewer->setViewport( viewParams, viewParams, viewParams, viewParams);
               GLfloat glMat;
               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::Drawable callback中写。第二种是使用setUpInWindow.Array只是提了一下,没有具体说怎么做。第三种是GraphicContex. 可是我试了第三种方法,就是没有任何反应,我不明白哪出了问题。因为按照OSG的原理,得到图形上下文(makeCurrent,releaseContex()).然后保存当前OSG所有的属性。然后写openGL代码是可以的。可是我的尝试表明没有任何结果出来。万般无奈。只希望一起学习的朋友帮助下。就是怎么在OSG中使用openGL代码。当然我需要的是除了使用osg::Drawable callback方法以外其他的方法!

StarShine 发表于 2014-6-18 10:02:28

http://blog.csdn.net/csxiaoshui/article/list/2。这是CSDN上的一个博客, 主要是 用OpenSceneGraph实现的NeHe OpenGL教程的,也许对你有用。

JacaYang 发表于 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代码。这两者还是有很大区别的。其实我已经解决了这个问题。
页: [1]
查看完整版本: 在OSG代码中使用openGL代码