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 <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()
。
【讨论】:
是的,这正是我现在的工作方式,尽管我想知道哪个更好。期望 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 <QGLFunctions>
,最接近的是#include <QtOpenGL/qglfunctions.h>
,这不起作用。
您的 .pro 文件是否包含正确的内容? qt-project.org/doc/qt-5.0/qtopengl/cube-cube-pro.html 如QT += opengl
?【参考方案3】:
如果您将QT += opengl
添加到您的项目 (.pro) 文件中,您会发现您不需要指定要导入的每个标头的文件夹,并且您将可以立即使用#include <QGLFunctions>
。
使用QGLFunctions
优于 GLEW 的优势在于,您确信您的应用程序可以在任何平台上编译,并且不依赖于您的系统上隐藏 GLEW 库的位置:Qt 库会为您完成这项工作。正如@phyatt 所指出的,Qt 的 Cube 示例是了解如何使用该库的一个很好的示例。
【讨论】:
我有 QT 的前沿版本(来自 git),我认为这是不正确的,在我的examples
文件夹中的示例中,每个项目的 glextensions
中都有一个类使用glBindBuffers
像 GLEW 一样执行争吵。【参考方案4】:
我在示例文件夹中找到了我的问题的答案。
具体来说,有必要复制一个名为glextensions.h
的标头,其功能类似于 GLEW。
我最终使用了 GLEW。
【讨论】:
以上是关于Qt5 中的 glGenBuffers 在哪里?的主要内容,如果未能解决你的问题,请参考以下文章