gpt4 book ai didi

c++ - 仅在 Release模式下使用 glGenBuffer 的未处理异常 - QT

转载 作者:太空狗 更新时间:2023-10-29 21:05:20 26 4
gpt4 key购买 nike

我在 Windows 7 上使用 Qt 4.8 Release模式编译我的项目时遇到了一些问题。在 Debug 上一切正常,但在 Release 上我得到一个未处理的异常: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);
...
}

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

最佳答案

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

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

也许 initializeGLFunctions() 方法没有获取 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);
}

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

关于c++ - 仅在 Release模式下使用 glGenBuffer 的未处理异常 - QT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10230976/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com