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

Por*_*ous 7 c++ opengl qt 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上下文; 发生在类'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..
}
Run Code Online (Sandbox Code Playgroud)

Mesh是一个不从任何东西继承的类.最初,它只使用了glew,因此它可以获得OpenGL函数的声明; 它不需要知道它们是否有效,因为那是glew的工作.然后在mainApp类中,我将实例化glew.我也明白,还有一个QOpenGLFunctions类,它的功能与glew的功能类似,但是对于所有这些GL类而言,知道要使用的内容显然令人困惑.更重要的是,我尝试寻找glGenVertexArrays(..),但在QOpenGLBuffer,QOpenGLFunctions或QOpenGLWidget中找不到它; 到目前为止,我知道,从OpenGL 4.5开始,它仍然是规范的一部分; 但我的图形驱动程序不使用OpenGL 4.5,所以我改用OpenGL 4.3.我只想说我愿意放弃采用Qt'

在各种类使用OpenGL函数的程序中,如何在不使用glew的情况下使用Qt来调用它们?Mesh是那些不实例化OpenGL但只使用其功能的类之一.

只是让人知道,我已经使用Qt一段时间了(虽然不够!)并且确实喜欢Qt; 但我确实需要知道如何将Qt与OpenGL结合使用以继续开发.大多数教程仍然使用5.4之前的东西.

wro*_*ans 4

在 Qt 5.4 中,存在具有特定于版本的 OpenGL 函数的标头,因此:

#include <QOpenGLFunctions_3_3_Core>
Run Code Online (Sandbox Code Playgroud)

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

QOpenGLFunctions_3_3_Core *fun = new QOpenGLFunctions_3_3_Core;
fun->initializeOpenGLFunctions();
Run Code Online (Sandbox Code Playgroud)

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

fun->glSomething(1,2,3)
Run Code Online (Sandbox Code Playgroud)

  • 另一种选择是从这样的类“继承”,因此您可以简单地编写“glSomething”,它就会起作用。 (3认同)