QOpenGLFunctions似乎缺少重要的函数,如glInvalidateFramebuffer和glMapBuffer。据我所知,QOpenGLFunctions加载了桌面OpenGL函数和ES函数的交集。如果是这样的话,为什么这两个功能不存在呢?据我所知,glMapBuffer就在两者之中。
我是否误解QOpenGLFunctions,或者他们实际上是否缺少功能(不太可能)?
答案 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上的粗略等效功能)。因此,它同时包含glMapBuffer
和glInvalidateFramebuffer
。
自行解决: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)
这两个案例和评论中的案例有多种原因:
在前面提到的glDrawArrays
案例中,该函数已经有一段时间了,无论是在桌面OpenGL还是支持Qt的ES中,因此没有太多需要手动解决任何问题。
您可以立即使用常规的opengl方式,包括gl.h
以及所有这些。
2)目前,Qt does not support OpenGL ES 3通过此界面。您提到的上述功能glMapBuffer
和glInvalidateFramebuffer
可能属于此类别。默认情况下,它们在OpenGL ES 2中不可用。
如果有任何功能未被曝光且未被上述理由所涵盖,则很可能会被忽视。