QtOpenGL高版本api使用
Published
Contents
要在 Qt 中使用 OpenGL,QGLWidget是一个很不错的选择,只需重载几个函数就好了。
但是在 QGLWidget 中,只有非常少数的 OpenGL 函数,查阅文档,在 QGLFunctions
类里有 OpenGL2.0/ES 的基本函数,没有更高版本的函数。
QGLFunctions 的使用方法比较简单,在构造函数中传入 QGLContext 就好了。
苦苦 Google 了一番,Qt把函数封装到一些奇怪的类里,如 QOpenGLFunctions_1_0, QOpenGLFunctions_1_1, QOpenGLFunctions_1_2, QOpenGLFunctions_1_3, QOpenGLFunctions_1_4, QOpenGLFunctions_1_5, QOpenGLFunctions_2_0, QOpenGLFunctions_2_1, QOpenGLFunctions_3_0 …
非常奇怪为什么 Qt 需要做这些奇怪的封装,似乎是为了跨平台的需求,那既然是在 pc 上,如何使用高版本的 API ?
QOpenGLFunctions_X_X
的使用方法和QGLFunctions
的使用方法不太一样,仍然需要继承自QOpenGLFunctions_X_X
,当然,直接声明也可以,如我实现的 QGLCL的renderbuffer:
struct DCLRenderBufferGL : public DCLBuffer, public QOpenGLFunctions_3_0 {
DCLRenderBufferGL() {
initializeOpenGLFunctions();
}
};
需要额外调用 initializeOpenGLFunctions()
来初始化函数,但是使用的时候我却出现了 bug,initializeOpenGLFunctions()
返回 false,然后函数使用返回段错误。
几番折腾以后找到了问题所在 ———— OpenGL上下文版本设置有问题,需要加入以下代码:
QGLFormat glf = QGLFormat::defaultFormat();
glf.setVersion(3,0);
QGLFormat::setDefaultFormat(glf);
注意,这个地方的 setVersion 必须不大不小刚刚好……
折腾这个的目的是,之前 OpenCL/OpenGL共享 中提到的 FBO,在 OpenGPU 论坛上提问以后得到了大神的回复,使用 glBlitFramebuffer
,这个函数是 OpenGL3.0的标准。
blog comments powered by Disqus