QOpenGLFunctions缺少重要的OpenGL函数

时间:2014-05-26 08:25:44

标签: c++ qt opengl qt5 qtgui

QOpenGLFunctions似乎缺少重要的函数,如glInvalidateFramebuffer和glMapBuffer。据我所知,QOpenGLFunctions加载了桌面OpenGL函数和ES函数的交集。如果是这样的话,为什么这两个功能不存在呢?据我所知,glMapBuffer就在两者之中。

我是否误解QOpenGLFunctions,或者他们实际上是否缺少功能(不太可能)?

2 个答案:

答案 0 :(得分:6)

QOpenGLFunctions只暴露了OpenGL 2(+ FBO)和OpenGL ES 2的公共子集。这就是为什么你的功能不存在的原因。 glMapBuffer在OpenGL 2中,但不在ES 2中(但是有OES扩展名); glInvalidateFramebuffer在OpenGL 4.3中。


如果您需要除公共子集之外的任何其他功能,您可以:

  • 从Qt 5.6开始,使用QOpenGLExtraFunctions ,其目标是OpenGL ES 3.0 / 3.1 API(以及桌面OpenGL上的粗略等效功能)。因此,它同时包含glMapBufferglInvalidateFramebuffer

  • 自行解决QOpenGLContext::getProcAddress

  • 使用QOpenGLContext::versionFunctions<T>() 获取包含给定OpenGL版本的所有函数的函数对象,例如

    auto functions = context->versionFunctions<QOpenGLFunctions_4_3_Core>();
    if (!functions) error();
    functions->initializeOpenGLFunctions();
    functions->glInvalidateFramebuffer(...);
    
  • #include <QOpenGLExtensions> 并使用包装所需扩展名的类(例如

    auto functions = new QOpenGLExtension_ARB_invalidate_subdata;
    if (!functions->initializeOpenGLFunctions()) error();
    functions->glInvalidateFramebuffer(...)
    
  • 将上述的组合包装在一个类中,该类将使用给定合适GL版本的已解析调用,或者回退到扩展,或者失败(例如:QOpenGLTexture)。

对于glMapBuffer,它实际上是以QOpenGLBuffer包裹的方式曝光的。

答案 1 :(得分:3)

这两个案例和评论中的案例有多种原因:

1)据我所知,the addition process was selective. Only those functions got added that you would need to resolve manually

在前面提到的glDrawArrays案例中,该函数已经有一段时间了,无论是在桌面OpenGL还是支持Qt的ES中,因此没有太多需要手动解决任何问题。

您可以立即使用常规的opengl方式,包括gl.h以及所有这些。

2)目前,Qt does not support OpenGL ES 3通过此界面。您提到的上述功能glMapBufferglInvalidateFramebuffer可能属于此类别。默认情况下,它们在OpenGL ES 2中不可用。

如果有任何功能未被曝光且未被上述理由所涵盖,则很可能会被忽视。