【发布时间】:2012-08-04 10:11:21
【问题描述】:
我在使用 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 上,问题仍然存在。
【问题讨论】:
-
你确定它在 glGenBuffers 中吗?我问是因为这听起来像是典型的缓冲区溢出场景。释放模式下的断点不可靠。您可以在每个 gl* 语句之前和之后放置日志语句以确认它崩溃的位置吗?
-
你试过检查这些函数的返回值吗?
-
是的,我确实在整个代码中放置了调试输出消息,如下所示:
qDebug() << "GL error message:" << glGetError();不幸的是,它们一直返回 0,直到它到达 glGenBuffers()。然后它崩溃了,甚至没有立即到达声明。 -
你没有说你是如何获得函数指针的。
-
尝试更改发布设置以生成调试文件,以便您可以使用调试器调查问题