Qt5 中的 glGenBuffers 在哪里?

Posted

技术标签:

【中文标题】Qt5 中的 glGenBuffers 在哪里?【英文标题】:Where is glGenBuffers in Qt5? 【发布时间】:2013-02-24 04:38:06 【问题描述】:

我似乎在 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

它在哪里?

【问题讨论】:

【参考方案1】:

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

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

假设你有一个调用所有这些函数的类:

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 的情况下调用 glGenBuffersglBindBufferglVertexAttribPointer 或任何 openGL 函数。

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

要解决这个问题,您可以使用自 Qt 5.1 起才可用的 QOpenGLFunctions_4_3_Core(或类似名称)。将QGLFunctions 替换为QOpenGLFunctions_4_3_Core,将initializeGLFunctions() 替换为initializeOpenGLFunctions()

【讨论】:

是的,这正是我现在的工作方式,尽管我想知道哪个更好。期望 GLEW 在查找 nvidia 特定功能方面做得更好并不是没有道理的。【参考方案2】:

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

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

希望有帮助!

【讨论】:

如果这么简单我就不会问这个问题了:-)。我没有包含匹配#include &lt;QGLFunctions&gt;,最接近的是#include &lt;QtOpenGL/qglfunctions.h&gt;,这不起作用。 您的 .pro 文件是否包含正确的内容? qt-project.org/doc/qt-5.0/qtopengl/cube-cube-pro.html 如QT += opengl?【参考方案3】:

如果您将QT += opengl 添加到您的项目 (.pro) 文件中,您会发现您不需要指定要导入的每个标头的文件夹,并且您将可以立即使用#include &lt;QGLFunctions&gt;

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

【讨论】:

我有 QT 的前沿版本(来自 git),我认为这是不正确的,在我的 examples 文件夹中的示例中,每个项目的 glextensions 中都有一个类使用glBindBuffers 像 GLEW 一样执行争吵。【参考方案4】:

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

具体来说,有必要复制一个名为glextensions.h 的标头,其功能类似于 GLEW。

我最终使用了 GLEW。

【讨论】:

以上是关于Qt5 中的 glGenBuffers 在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

glGenBuffers - 释放内存?

VBO的第一次初始化。在哪里绑定重要吗?

glGenBuffers 为 NULL,在使用 glew 时给出 0x0000000 访问冲突

glVertexPointer 的目的是啥?

glGenBuffers 不设置缓冲区

仅在发布模式下使用 glGenBuffer 的未处理异常 - QT