QOpenGLFunctions 缺少重要的 OpenGL 函数

Posted

技术标签:

【中文标题】QOpenGLFunctions 缺少重要的 OpenGL 函数【英文标题】:QOpenGLFunctions missing important OpenGL functions 【发布时间】:2014-05-26 08:25:44 【问题描述】:

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

我误解了 QOpenGLFunctions,还是它们实际上缺少函数(不太可能)?

【问题讨论】:

缺少函数,也没有glDrawArrays @ratchetfreak 你知道为什么吗? @Ben 因为glDrawArrays (...) 是一个 OpenGL 1.1 函数,并且 Qt 的所有实现平台都支持它开箱即用。缺少 MapBuffer 的原因可能是因为它是 OpenGL ES 中的一个可选扩展。 【参考方案1】:

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 &lt;QOpenGLExtensions&gt; 并使用包装您需要的扩展的类,例如

auto functions = new QOpenGLExtension_ARB_invalidate_subdata;
if (!functions->initializeOpenGLFunctions()) error();
functions->glInvalidateFramebuffer(...)

将上述组合包装在一个类中,该类将使用给定合适的 GL 版本的已解析调用,或者回退到扩展,或者失败(例如:QOpenGLTexture)。 p>

对于glMapBuffer,它实际上以某种方式被QOpenGLBuffer 包裹暴露。

【讨论】:

太棒了!我发现 Qt5 中的 OpenGL 充其量是令人困惑的,这当然对我有帮助。但是一个大问题仍然存在,在我现有的代码库中,我有很多 opengl 代码,我现在正试图将它们引入我的 Qt5 应用程序。有什么方法可以使用 QOpenGLContext::versionFunctions() 方法来获取正确的函数对象,而不必在每个 opengl 调用前面加上 functions-> ? 当您说“正确的功能”时,您指的是特定的 GL 版本吗?【参考方案2】:

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

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 中不可用。

如果有任何功能没有被暴露出来,并且没有被上述原因覆盖,那很可能是忽略了。

【讨论】:

你的意思是包括gl.h?但是,这些功能在 Windows 中不可用。 我还是一头雾水。某些系统上提供的 opengl 标头不包括我在问题中提到的功能。你如何获得这些? 啊,我没有意识到它们在 ES 2 中不可用。谢谢。

以上是关于QOpenGLFunctions 缺少重要的 OpenGL 函数的主要内容,如果未能解决你的问题,请参考以下文章

QOpenGLFunctions的相关的使用

QOpenGLFunctions的正确用法

QOpenGLFunctions的使用

QOpenGLFunctions 和 PySide2

在使用 QOpenGLFunctions 时将 OpenGL 功能封装在 C++ 对象中

带有 QT 错误的 OpenGL:断言:“QOpenGLFunctions::isInitialized(d_ptr)”。无法创建 OpenGL 上下文