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之前的东西.
在 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)
| 归档时间: |
|
| 查看次数: |
5725 次 |
| 最近记录: |