我是使用ogre3D的新手,我在某一点上需要帮助!
我正在尝试一个混合ogre3D引擎和qtml的库:
http://advancingusability.wordpress.com/2013/08/14/qmlogre-is-now-a-library/
当您想要绘制某个对象并旋转或翻译这些已在第一步中初始化的对象时,此库可正常工作。
void initialize(){
// we only want to initialize once
disconnect(this, &ExampleApp::beforeRendering, this, &ExampleApp::initializeOgre);
// start up Ogre
m_ogreEngine = new OgreEngine(this);
m_root = m_ogreEngine->startEngine();
m_ogreEngine->setupResources();
m_ogreEngine->activateOgreContext();
//draw a small cube
new DebugDrawer(m_sceneManager, 0.5f);
DrawCube(100,100,100);
DebugDrawer::getSingleton().build();
m_ogreEngine->doneOgreContext();
emit(ogreInitialized());
}
但如果您想在此初始化步骤后绘制或更改场景,则会出现问题! 实际上只在Ogre3D中(没有qtogre库),你必须使用frameListener 它将连接渲染线程并允许重绘场景。 但是在这里,我们有两个ContextOpengl:一个用于qt,另一个用于Ogre。 所以如果你试图把代码的共同部分放在一起:
createScene();
createFrameListener();
// La Boucle de rendu
m_root->startRendering();
//createScene();
while(true)
{
Ogre::WindowEventUtilities::messagePump();
if(pRenderWindow->isClosed())
std::cout<<"pRenderWindow close"<<std::endl;
if(!m_root->renderOneFrame())
std::cout<<"root renderOneFrame"<<std::endl;
}
该应用程序将冻结!我知道startRendering本身就是一个渲染循环,所以下面的循环永远不会被执行。 但我不知道在哪里放这些线或如何纠正这部分!
我还尝试添加后台缓冲区并交换它们:
void OgreEngine::updateOgreContext()
{
glPopAttrib();
glPopClientAttrib();
m_qtContext->functions()->glUseProgram(0);
m_qtContext->doneCurrent();
delete m_qtContext;
m_BackgroundContext= QOpenGLContext::currentContext();
// create a new shared OpenGL context to be used exclusively by Ogre
m_BackgroundContext = new QOpenGLContext();
m_BackgroundContext->setFormat(m_quickWindow->requestedFormat());
m_BackgroundContext->setShareContext(m_qtContext);
m_BackgroundContext->create();
m_BackgroundContext->swapBuffers(m_quickWindow);
//m_ogreContext->makeCurrent(m_quickWindow);
}
但我也有同样的错误:
OGRE EXCEPTION(7:InternalErrorException): Cannot create GL vertex buffer in GLHardwareVertexBuffer::GLHardwareVertexBuffer at Bureau/bibliotheques/ogre_src_v1-8-1/RenderSystems/GL/src/OgreGLHardwareVertexBuffer.cpp (line 46)
我很困惑! 我不知道该怎么办?
谢谢!