4

我似乎在 Qt5 中找不到该glGenBuffer函数,我的包含列表看起来像

#include <QtOpenGL/qgl.h>
#include <QtOpenGL/qglbuffer.h>
#include <QtOpenGL/qglcolormap.h>
#include <QtOpenGL/qglframebufferobject.h>
#include <QtOpenGL/qglfunctions.h>
#include <QtOpenGL/qglpixelbuffer.h>
#include <QtOpenGL/qglshaderprogram.h>
#include <GL/GLU.h>

我正在尝试执行类似以下示例的操作:

http://qt-project.org/doc/qt-5.0/qtopengl/cube.html

它在哪里?

4

4 回答 4

7

我知道我迟到了,但这里有一个更优雅的解决方案(你不需要 GLEW =))

除了确保您QT += opengl的 *.pro 文件中有,并且您的 Qt 版本有 OpenGL,并且您有#include <QGLFunctions>(您不需要上面列出的所有这些;只需这一行)头文件,你还需要一件事。

因此,假设您有一个调用所有这些函数的类:

class MeGlWindow : public QGLWidget
{
   // bla bla bla...
}

您需要继承一个受保护的类QGLFunctions

class MeGlWindow : public QGLWidget, protected QGLFunctions // add QGLFunctions
{
   // bla bla bla...
}

glewInit()此外,就像在调用 OpenGL 函数之前需要调用一次 GLEW 一样,QGLFunctions需要调用initializeGLFunctions(). 例如, in QGLWidget,initializeGL()在开始绘制任何东西之前被调用一次:

void MeGlWindow::initializeGL()
{
    initializeGLFunctions();

    // ...now you can call your OpenGL functions!
    GLuint myBufferID;
    glGenBuffers(1, &myBufferID);

    // ...
}

现在您应该能够在没有 GLEW 的情况下调用、glGenBuffers或任何 openGL 函数。glBindBufferglVertexAttribPointer

更新: 某些 OpenGL 函数喜欢glVertexAttribDivisorglDrawElementsInstanced不使用QGLFunctions。这是因为QGLFunctions只提供 OpenGL/ES 2.0 API 特有的功能,可能没有这些功能。

要解决这个问题,您可以使用QOpenGLFunctions_4_3_Core(或类似的),它仅在 Qt 5.1 之后才可用。替换QGLFunctionsQOpenGLFunctions_4_3_Core和。initializeGLFunctions()_initializeOpenGLFunctions()

于 2014-06-18T13:28:59.573 回答
1

查看您引用的示例的来源:

http://qt-project.org/doc/qt-5.0/qtopengl/cube-geometryengine-h.html

它有:

#include <QGLFunctions>

哪个有glGenBuffers

http://qt-project.org/doc/qt-5.0/qtopengl/qglfunctions.html

http://qt-project.org/doc/qt-5.0/qtopengl/qglfunctions.html#glGenBuffers

希望有帮助!

于 2013-02-24T05:51:42.747 回答
1

如果你添加QT += opengl到你的项目(.pro)文件中,你会发现你不需要指定你正在导入的每个头文件的文件夹,就可以立即使用#include <QGLFunctions>

使用QGLFunctionsGLEW 的优势在于,您确信您的应用程序可以在任何平台上编译,并且不依赖于您的系统中 GLEW 库隐藏的位置:Qt 库将为您完成这项工作。正如@phyatt 所指出的,Qt 的 Cube 示例是了解如何使用该库的一个很好的示例。

于 2013-02-25T15:50:17.833 回答
0

我在示例文件夹中找到了我的问题的答案。

具体来说,有必要复制一个名为glextensions.hwhich functions like GLEW 的标题。

我最终使用了 GLEW。

于 2013-02-25T09:11:30.437 回答