[英]QOpenGLFunctions missing important OpenGL functions
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
包裝的方式QOpenGLBuffer
。
這兩個案例和評論中的案例有多種原因:
1)據我所知, 加法過程是有選擇性的。 只添加了您需要手動解決的功能 。
在前面提到的glDrawArrays
案例中,該函數已經有一段時間了,無論是在桌面OpenGL還是支持Qt的ES中,因此沒有太多需要手動解決任何問題。
您可以立即使用常規的opengl方式,包括gl.h
和所有這些。
2)目前, Qt不支持通過此接口的OpenGL ES 3 。 您的上述函數glMapBuffer
和glInvalidateFramebuffer
可能屬於這一類。 默認情況下,它們在OpenGL ES 2中不可用。
如果有任何功能沒有被曝光而且沒有被上述原因所涵蓋,那么很可能會被忽視。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.