我知道我迟到了,但这里有一个更优雅的解决方案(你不需要 GLEW =))
除了确保您的 *.pro 文件中有 QT += opengl,并且您的 Qt 版本有 OpenGL,并且您有 #include <QGLFunctions>(您不需要所有这些包括您列出的上面;只有这一行)在你的头文件中,你还需要一件事。
假设你有一个调用所有这些函数的类:
class MeGlWindow : public QGLWidget
{
// bla bla bla...
}
你需要继承一个受保护的类QGLFunctions:
class MeGlWindow : public QGLWidget, protected QGLFunctions // add QGLFunctions
{
// bla bla bla...
}
另外,正如 GLEW 要求在调用 OpenGL 函数之前调用一次 glewInit() 一样,QGLFunctions 要求你调用 initializeGLFunctions()。例如,在QGLWidget 中,initializeGL() 在开始绘制之前被调用一次:
void MeGlWindow::initializeGL()
{
initializeGLFunctions();
// ...now you can call your OpenGL functions!
GLuint myBufferID;
glGenBuffers(1, &myBufferID);
// ...
}
现在您应该可以在没有 GLEW 的情况下调用 glGenBuffers、glBindBuffer、glVertexAttribPointer 或任何 openGL 函数。
更新:
某些 OpenGL 函数,如 glVertexAttribDivisor 和 glDrawElementsInstanced 不适用于 QGLFunctions。这是因为QGLFunctions 只提供了OpenGL/ES 2.0 API 特有的功能,可能没有这些功能。
要解决这个问题,您可以使用自 Qt 5.1 起才可用的 QOpenGLFunctions_4_3_Core(或类似名称)。将QGLFunctions 替换为QOpenGLFunctions_4_3_Core,将initializeGLFunctions() 替换为initializeOpenGLFunctions()。