【发布时间】:2015-01-30 12:10:12
【问题描述】:
我之前发布了一个关于如何让 OpenGL 在 Qt 上运行的问题,但现在我希望能够使用 OpenGL 提供的最新功能。在 Qt 之前,我使用的是 glew;但 Qt 说 glew 与其 QtOpenGL 头文件冲突。我研究了 QGLWidget 和 QGLFunctions,但坦率地说,我很困惑我应该做什么才能简单地访问 OpenGL 的函数。
现在,我使用 Qt Creator 3.3.0 获得了 Qt 5.4,并且正在使用新的 QOpenGLWidget;然而,在它应该如何使用方面缺乏指导让我有点失望:Qt 文档在那里并且确实有帮助,但它只演示了如何实例化它,而不是在程序的其他位置使用它。我知道这个 QOpenGLWidget 的功能类似于 QGLWidget。我应该从它继承的 Qt 细节;但是我没有在它想要使用 OpenGL 函数的类中实例化 OpenGL 上下文;这发生在“glWidget”类中,它继承自 QOpenGLWidget。
例如,摘自我的一个使用 OpenGL 代码的课程:
void Mesh::init()
{
pNumIndices = pIndices.size();
glGenVertexArrays(1, &pVAO);
glGenBuffers(1, &pVertexBuffer);
glGenBuffers(1, &pIndexBuffer);
glBindVertexArray(pVAO);
glBindBuffer(GL_ARRAY_BUFFER, pVertexBuffer);
glBufferData(GL_ARRAY_BUFFER, pVertices.size() * sizeof(Vertex),
&pVertices[0], GL_STATIC_DRAW);
// etc..
}
Mesh 是一个不继承任何东西的类。最初,它只使用 glew 来获取 OpenGL 函数的声明;它不需要知道它们是否有效,因为那是 glew 的工作。然后在 mainApp 类中,我将实例化 glew。我也知道还有一个 QOpenGLFunctions 类,它的功能有点类似于 glew,但是对于所有这些 GL 类,知道使用什么是公然的混乱。更重要的是,我尝试寻找 glGenVertexArrays(..) 但在 QOpenGLBuffer、QOpenGLFunctions 或 QOpenGLWidget 中找不到;据我所知,从 OpenGL 4.5 开始,它仍然是规范的一部分;但我的图形驱动程序不使用 OpenGL 4.5,所以我改用 OpenGL 4.3。我只想说我愿意放弃 glew 采用 Qt 自己的方法来调用 OpenGL 函数。
在各种类都使用 OpenGL 函数的程序中,我如何利用 Qt 来调用它们而不使用 glew? Mesh 是那些不实例化 OpenGL 的类之一,但仅使用其功能。
大家都知道,我使用 Qt 已经有一段时间了(虽然还不够!)并且很喜欢 Qt;但我确实需要知道如何将 Qt 与 OpenGL 结合使用来继续开发。大多数教程仍然使用 5.4 之前的内容。
【问题讨论】:
-
glGenVertexArrays用于顶点数组对象,那么您应该查找的类名是什么?没错,QOpenGLVertexArrayObject! -
我个人不喜欢 Q 的东西,它集中封装了 OpenGL 的东西。我非常喜欢自己在自己的课程中做这类事情。
标签: c++ qt opengl opengl-es qt5