簡體   English   中英

QOpenGLFunctions缺少重要的OpenGL函數

[英]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上的粗略等效功能)。 因此,它同時具有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包裝的方式QOpenGLBuffer

這兩個案例和評論中的案例有多種原因:

1)據我所知, 加法過程是有選擇性的。 只添加了您需要手動解決的功能

在前面提到的glDrawArrays案例中,該函數已經有一段時間了,無論是在桌面OpenGL還是支持Qt的ES中,因此沒有太多需要手動解決任何問題。

您可以立即使用常規的opengl方式,包括gl.h和所有這些。

2)目前, Qt不支持通過此接口的OpenGL ES 3 您的上述函數glMapBufferglInvalidateFramebuffer可能屬於這一類。 默認情況下,它們在OpenGL ES 2中不可用。

如果有任何功能沒有被曝光而且沒有被上述原因所涵蓋,那么很可能會被忽視。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM