c++ - 在 Qt 5.4 中跨类使用最新的 OpenGL 函数

标签 c++ qt opengl opengl-es qt5

我之前发布了一个关于如何让 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 上下文;这发生在继承自 QOpenGLWidget 的“glWidget”类中。

例如,摘 self 使用 OpenGL 代码的类(class)之一:

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 之前的内容。

最佳答案

在 Qt 5.4 中,有带有版本特定 OpenGL 函数的头文件,因此:

#include <QOpenGLFunctions_3_3_Core>

或者您想要使用的任何版本。然后在具有有效 OpenGL 上下文(如 QOpenGLWidget::initializeGL())的某个地方创建并初始化一个 QOpenGLFunctions 对象:

QOpenGLFunctions_3_3_Core *fun = new QOpenGLFunctions_3_3_Core;
fun->initializeOpenGLFunctions();

然后在您的绘制代码中,只需使用该对象的 OpenGL 函数:

fun->glSomething(1,2,3)

关于c++ - 在 Qt 5.4 中跨类使用最新的 OpenGL 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28235640/

相关文章:

c++ - g++ 不能在 Mac OS X Mavericks 上编译

c++ - 如何循环矩阵让对角线上的数字具有高优先级?

c++ - Xcode 中的 GLEW 参数补全

c++ - 使用Kinect调用Open Gl的鼠标功能

c++ - QMessagebox 未在 Qt 错误中声明

opengl - 在线程中使用opengl

c++ - 关于 std::vector<T> object[arraySize] 的可能误解

c++ - 从基类实例化派生对象

performance - 如何更改 QListWidget 实现以提高性能?

qt - 使用 QtMultimedia 从 MP3 文件中读取原始 PCM 样本?