OpenGL:使用Qt的OpenGL无法正确显示,出现QOpenGLBuffer::bind: buffer is not valid in the current context的错误
使用OpenGL的时候发现图形无法正确加载,最后定位到bug是在下面这段代码中。
buffer->bind();
buffer->allocate(data, static_cast<int>(data.size()));
buffer->release();
同时控制台输出了一句信息:QOpenGLBuffer::bind: buffer is not valid in the current context,也就是bind()未生效导致数据没有写到QOpenGLBuffer里。
各个平台搜索结果无果,最后鬼使神差看到了有人提到了QOpenGLWidget::makeCurrent()函数,这个函数的功能详见官方文档QOpenGLWidget。关键是这段话:
Your widget’s OpenGL rendering context is made current when paintGL(), resizeGL(), or initializeGL() is called. If you need to call the standard OpenGL API functions from other places (e.g. in your widget’s constructor or in your own paint functions), you must call makeCurrent() first.
翻译一下:
调用paintGL()、resizeGL()或initializeGL()时,小部件的OpenGL渲染上下文变为当前。如果需要从其他位置(例如,在小部件的构造函数或自己的绘制函数中)调用标准OpenGL API函数,则必须首先调用makeCurrent()。
所以,问题在于出bug的代码不在上面提到的三个特殊函数里,因此必须在bind前加上makeCurrent,改过之后:
QOpenGLWidget::makeCurrent();
buffer->bind();
buffer->allocate(data, static_cast<int>(data.size()));
buffer->release();
问题解决!