QOpenGLFunctions似乎缺少重要函数,如glInvalidateFramebuffer和glMapBuffer。据我了解,QOpenGLFunctions加载桌面OpenGL函数和ES函数的交集。如果是这样,为什么这两个函数不在?从我所知道的情况来看,glMapBuffer存在于两者之中。
我是否误解了QOpenGLFunctions,或者它们确实缺少函数(不太可能)?
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) 据我所知,添加过程是有选择性的。只有那些需要手动解决的函数才会被添加。
在上述的glDrawArrays
案例中,该函数在桌面OpenGL以及支持Qt的ES中已经可用了一段时间,因此在那里没有太多需要手动解决的问题。
您可以直接使用常规的opengl方法,包括gl.h
等。
2) 目前,Qt不支持通过此接口使用OpenGL ES 3。您提到的函数glMapBuffer
和glInvalidateFramebuffer
可能属于这个类别。它们在OpenGL ES 2中“默认情况下”不可用。
如果有任何未公开的函数并且未被上述原因覆盖,那么很可能是一个疏忽或其他原因。
glDrawArrays(...)
是一个OpenGL 1.1函数,而Qt实现的所有平台都支持它。MapBuffer缺失的原因可能是因为它是OpenGL ES中的可选扩展。 - Andon M. Coleman