2013-04-10 217 views
2

我正在使用支持OpenGL模式的Ogre3d引擎。在什么情况下glGenBuffers/glGenBuffersARB失败?

我有一个对象叫做Chunk它创建了一个Ogre::ManualObject。由于ManualObject的创建需要一些时间,我将任务放到了一个新线程中。

不幸的是,穿线ManualObject的创建之后,我现在得到以下OgreException:

“无法建立GLHardwareVertexBuffer :: GLHardwareVertexBuffer GL顶点缓冲区”

我看着代码并且它失败at this stage

glGenBuffersARB(1, &mBufferId); 

if (!mBufferId) 
{ 
    OGRE_EXCEPT(Exception::ERR_INTERNAL_ERROR, 
     "Cannot create GL vertex buffer", 
     "GLHardwareVertexBuffer:: 
} 

这表明glGenB uffersARB()没有正确填充mBufferId。

我无法弄清楚是什么原因造成的,有什么建议吗?

+0

在调用'glGenBuffersARB()'之前和之后'glGetError()'告诉你什么? – user1118321 2013-04-11 05:21:52

回答

7

由于ManualObject的创建需要一些时间我把任务放到一个新的线程上。

这就是你的问题。 OpenGL上下文一次只能在一个线程中处于活动状态。如果你从一个没有OpenGL上下文绑定的线程中调用OpenGL命令,你所得到的只是错误。

+0

啊谢谢你!所以从这个角度来看,最好的行动方式是让一个线程专用于图形任务。 什么是正确的方式来指定哪个线程应通过Ogre绑定OpenGL上下文? – 2013-04-11 22:12:27

+0

@RazorStorm:对不起,我从来没有使用Ogre引擎,所以我也必须先查阅文档。 – datenwolf 2013-04-11 22:36:00

+0

好的,没问题!我会查看文档/源代码,看看我能找到什么。 – 2013-04-11 22:39:21

相关问题