gpt4 book ai didi

c++ - glGenBuffers 在 Release Build 中崩溃

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:35:59 25 4
gpt4 key购买 nike

我在使用 OpenGL 函数 glGenBuffers() 时遇到了一个奇怪的问题。我正在编写一个相当简单的应用程序,其中我使用以下列方式声明的 VBO:

#include <QGLFunctions>
#include <QGLWidget>

class MyClass : public QGLWidget, protected QGLFunctions {
GLuint vertexBufferObject;

// ...
GLuint makeBufferList(void);
}

GLuint MyClass::makeBufferList(void) {
vertexBufferObject = 0;
glGenBuffers(1, &vertexBufferObject); // <-- Here it crashes

// ... load data and render

return vertexBufferList;
}

MyClass::MyClass(QWidget* parent)
: QGLWidget(parent),
vertexBufferObject(0)
{
QGLContext* context = new QGLContext(this->format());
initializeGLFunctions(context);
glInit();
}

MyClass::~MyClass() {
glDeleteBuffers(1, &vertexBufferObject);
}

这一切在调试构建中都工作得很好。数据呈现得很好,而且程序最终正确完成。但是,在 Release Build 中,glGenBuffers() 会使程序崩溃。它不仅返回 0 或什么也不做,它会在函数调用时崩溃。但由于问题只发生在 Release 模式下,我无法使用调试器找出问题所在。

我正在使用 Windows 7 系统并在 Qt 4.8.1 中进行开发。编译器为MSVC 2010 (Qt SDK)编译器。

有没有人有任何我可以尝试的建议?

//编辑:

可能有用:我尝试使用 GCC (Qt SDK) 编译器在 Mac 上编译完全相同的代码,并且 Debug 和 Release Build 都工作得很好。但在 Windows 7 上,问题仍然存在。

最佳答案

找到了问题所在(感谢@MahmoudFayez):问题来自 Qt API 中的错误,它导致 glGenBuffers() 函数(可能还有其他函数)崩溃。这个问题直接等同于这里讨论的问题:

解决方案虽然不是很优雅,但相对简单:使用 GLEW 而不是 QGLFunctions。我通过以下方式解决了我的问题:

#include "glew.h"
#include <QGLWidget>

class MyClass : public QGLWidget {
// ...same as the above
}

MyClass::MyClass(QWidget* parent)
: QGLWidget(parent),
vertexBufferObject(0)
{
makeCurrent();
glewInit();
}

这一切都解决了。缺点是这涉及使用额外的外部依赖项,而使用 Qt 就是尽可能兼容,尽可能少的外部依赖项。不过这个bug好像要等到Qt 5.0发布才能修复。

作为最后的评论:我无法弄清楚这个错误中的哪一部分只导致崩溃的发布版本,而不是 Debug模式。

关于c++ - glGenBuffers 在 Release Build 中崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11845230/

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