仅在发布模式下使用 glGenBuffer 的未处理异常 - QT

Unhandled Exception using glGenBuffer on Release mode only - QT

本文关键字:glGenBuffer 未处理 异常 QT 布模式 模式      更新时间:2023-10-16

我在发布模式下使用 Qt 4.8 在 Windows 7 上编译我的项目时遇到了一些问题。在调试上一切正常,但在发布时我收到一个未经处理的异常:0xC0000005:访问冲突。

我将其缩小到发生这种情况的行,即生成像素缓冲区时。我的第一个猜测是错误的 DLL 加载,但我使用 Dependency Walker 检查了可执行文件,并且加载的每个 DLL 都是正确的。

以下是我的一些代码:

class CameraView : public QGLWidget, protected QGLFunctions;
void CameraView::initializeGL()
{
    initializeGLFunctions(this->context());
    glGenBuffers(1, &pbo_); //<<<<<  This is where I get the unhandled exception on Release mode
        glBindBuffer(QGLBuffer::PixelUnpackBuffer, pbo_);
        glBufferData(QGLBuffer::PixelUnpackBuffer, 3 * sizeof(BYTE) * image_width_ * image_height_, NULL, GL_STREAM_DRAW);
        ...
}

同样,这在调试时效果很好。 为什么这只会发生在发布版上?

我明白了。似乎这个问题与这个问题有关:https://forum.qt.io/topic/12492/qt-4-8-qglfunctions-functions-crash-in-release-build

还有一个错误报告可能也与此相关:https://bugreports.qt.io/browse/QTBUG-5729

也许初始化GLFunctions()方法没有获取GL扩展函数的所有函数指针,我真的不知道为什么,但似乎是这样。

对我来说,解决方案是停止使用Qt的GL扩展并开始使用glew。

所以,这是对我有用的:

#include <QtGui/QtGui>
#include <gl/glew.h>
#include <QtOpenGL/QGLWidget>
class CameraView : public QGLWidget;
void CameraView::initializeGL()
{
   //initializeGLFunctions(this->context());
   GLenum init = glewInit();

   // Create buffers
   glGenBuffers(1, &pbo_);
   glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo_);
   glBufferData(GL_PIXEL_UNPACK_BUFFER, 3 * sizeof(BYTE) * image_width_ * image_height_, NULL, GL_STREAM_DRAW);
   // Set matrixes
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
   glOrtho(0, this->width(), 0, this->height(), 0, 1);
   glClearColor(0.0, 0.0, 0.0, 0.0);
   glShadeModel(GL_FLAT);
   glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
}

确保在任何 QTOpenGL 标头之前包含 glew.h,否则您将收到编译错误。