QOpenGLFunctions缺少重要的OpenGL函数

7

QOpenGLFunctions似乎缺少重要函数,如glInvalidateFramebuffer和glMapBuffer。据我了解,QOpenGLFunctions加载桌面OpenGL函数和ES函数的交集。如果是这样,为什么这两个函数不在?从我所知道的情况来看,glMapBuffer存在于两者之中。

我是否误解了QOpenGLFunctions,或者它们确实缺少函数(不太可能)?


有一些函数缺失,也没有“glDrawArrays”。 - ratchet freak
@ratchetfreak 你知道为什么吗? - Ben
@Ben 因为 glDrawArrays(...) 是一个OpenGL 1.1函数,而Qt实现的所有平台都支持它。MapBuffer缺失的原因可能是因为它是OpenGL ES中的可选扩展。 - Andon M. Coleman
2个回答

10

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进行了一定程度的封装暴露出来的。


太棒了!我发现在Qt5中使用OpenGL最好还是有些困惑,这确实帮助了我。但是仍有一个大问题,我现有的代码库中有很多OpenGL代码,现在我正在尝试将它们引入到我的Qt5应用程序中。是否有任何方法可以使用QOpenGLContext::versionFunctions<T>()方法获取正确的函数对象,而无需在每个OpenGL调用前加上functions->前缀? - Mr. Developerdude
当你说“正确的函数”时,你是指特定的GL版本吗? - peppe

4

这两种情况和评论中的一种有多种原因:

1) 据我所知,添加过程是有选择性的。只有那些需要手动解决的函数才会被添加

在上述的glDrawArrays案例中,该函数在桌面OpenGL以及支持Qt的ES中已经可用了一段时间,因此在那里没有太多需要手动解决的问题。

您可以直接使用常规的opengl方法,包括gl.h等。

2) 目前,Qt不支持通过此接口使用OpenGL ES 3。您提到的函数glMapBufferglInvalidateFramebuffer可能属于这个类别。它们在OpenGL ES 2中“默认情况下”不可用。

如果有任何未公开的函数并且未被上述原因覆盖,那么很可能是一个疏忽或其他原因。


你的意思是包含gl.h头文件吗?然而这些函数在Windows中不可用。 - Ben
我仍然感到困惑。某些系统提供的OpenGL头文件不包含我在问题中提到的函数。你如何获取它们? - Ben
啊,我没意识到它们在ES 2中不可用。谢谢。 - Ben

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接