我知道我迟到了,但这里有一个更优雅的解决方案(你不需要 GLEW =))
除了确保你有QT += opengl
在你的 *.pro 文件中,并且你的 Qt 版本有 OpenGL,并且你有#include <QGLFunctions>
(您不需要上面列出的所有内容;只需这一行)在您的头文件中,您还需要一件事。
因此,假设您有一个调用所有这些函数的类:
class MeGlWindow : public QGLWidget
{
// bla bla bla...
}
你需要继承一个受保护的类QGL函数 http://qt-project.org/doc/qt-4.8/qglfunctions.html:
class MeGlWindow : public QGLWidget, protected QGLFunctions // add QGLFunctions
{
// bla bla bla...
}
另外,正如 GLEW 所要求的glewInit()
在调用 OpenGL 函数之前调用一次,QGLFunctions
需要你打电话initializeGLFunctions()
。例如,在QGLWidget
, initializeGL()
在开始绘制任何内容之前调用一次:
void MeGlWindow::initializeGL()
{
initializeGLFunctions();
// ...now you can call your OpenGL functions!
GLuint myBufferID;
glGenBuffers(1, &myBufferID);
// ...
}
现在你应该可以打电话了glGenBuffers
, glBindBuffer
, glVertexAttribPointer
或任何没有 GLEW 的 openGL 函数。
UPDATE:
某些 OpenGL 函数,如glVertexAttribDivisor
and glDrawElementsInstanced
不与QGLFunctions
。这是因为QGLFunctions
仅提供OpenGL/ES 2.0 API特有的功能,可能不具备这些功能。
要解决这个问题,你可以使用QOpenGLFunctions_4_3_Core http://qt-project.org/doc/qt-5/qopenglfunctions-4-3-core.html(或类似)仅自 Qt 5.1 起可用。代替QGLFunctions
with QOpenGLFunctions_4_3_Core
, and initializeGLFunctions()
with initializeOpenGLFunctions()
.