[英]glGenBuffers crashes in Release Build
我在使用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);
}
这一切在Debug Build中完全正常。 数据渲染得很好,所有程序最终都能正确完成。 但是,在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则尽可能地兼容,尽可能少的外部依赖。 但是,似乎我们需要等到Qt 5.0发布才能修复此错误。
作为最后评论:我无法弄清楚这个bug中的哪个部分只会使Release Build崩溃,而不是Debug模式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.