|
最近由于导师要求,要我实现调试模式下,在屏幕上显示相关的调试信息,比如我自己设计一个调试函数叫
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方法以外其他的方法! |
|