Published

25 October 2013

Tags

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