OSG использует ленивые обновления состояния, что OSG не будет сбрасывать состояние opengl после фрейма.см. этот форум http://forum.openscenegraph.org/viewtopic.php?t=6976, чтобы мы могли выдвигать и открывать состояние opengl между viewer->frame()
.Но решение состоит в том, чтобы использовать glPushClientAttrib
вместо glPushAttrib
, поскольку opengl использует режим клиент / сервер, клиент и сервер поддерживают различные типы состояний, см. Этот форум: http://www.glprogramming.com/red/chapter07.html. Код теперь стал таким
void OsgQGraphicsView::drawBackground(QPainter *painter, const QRectF &rect)
{
if(painter->paintEngine()->type() != QPaintEgin::OpenGL2)
{
// error manage
}
painter->save();
painter->beginNativePainting();
glPushClientAttrib(GL_CLIENT_ALL_ATTRIB_BITS);
viewer_->frame();
glPopClientAttrib();
painter->endNativePainting();
painter->restore();
}
но этого недостаточно, поскольку мы восстанавливаем состояние opengl для qt, чтобы рисовать графические элементы, но состояние opengl для osg грязное после отрисовки элементов qt.Таким образом, мы все еще должны сбросить состояние opengl для osg, так что Thaks на Sean Spicer http://forum.openscenegraph.org/viewtopic.php?t=2308 дать решение (работает на osg3.4 с qt5.6.3. Я пробовал osg3.6, он вылетает):
void OsgQGraphicsView::drawBackground(QPainter *painter, const QRectF &rect)
{
if(painter->paintEngine()->type() != QPaintEgin::OpenGL2)
{
// error manage
}
painter->save();
painter->beginNativePainting();
glPushAttrib(GL_ALL_ATTRIB_BITS);
glPushClientAttrib(GL_CLIENT_ALL_ATTRIB_BITS);
glMatrixMode(GL_TEXTURE);
glPushMatrix();
glLoadIdentity();
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
osg::State *state = viewer_->getCamera()->getGraphicsContext()->getState();
state->reset();
state->apply(last_stateset);
viewer_->frame();
viewer_->getCamera()->getGraphicsContext()->getState()->captureCurrentState(*last_stateset);
// Pop matricies.
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_TEXTURE);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
glPopAttrib();
glPopClientAttrib();
painter->endNativePainting(); // reset opengl state for qt
painter->restore();
}