2016-09-21 82 views
0

我正拼命地理解的架構OpenGL支持Qt5。我目前的問題是這樣的:我有一些現有的OpenGL代碼(桌面,而不是OpenGL ES),它使用一些OpenGL擴展,包括glGenBuffersARB。外QT5能夠訪問這些功能,像這樣的擴展是微不足道的,例如,通過使用GLEW我可以簡單地這樣做:如何在Qt5中使用擴展glGenBuffersARB?

glewInit(); 

和預期的一樣,一切都會神奇地工作,我可以開始使用glGenBuffersARB馬上。如果我很擔心,我可以打電話給glewIsSupported以確保它得到支持。

但在QT5有一個警告,GLEW和QOpenGLFunctions不玩好起來(從qopenglfunctions.h複製):

#ifdef __GLEW_H__ 
#if defined(Q_CC_GNU) 
#warning qopenglfunctions.h is not compatible with GLEW, GLEW defines will be undefined 
#warning To use GLEW with Qt, do not include <qopengl.h> or <QOpenGLFunctions> after glew.h 
#endif 
#endif 

所以我們可以說,我對這個問題的緣故,滿足好奇心完全拋棄GLEW並完全依靠Qt5來實現純粹的Qt5方法。我如何獲得依賴glGenBuffersARB的現有OpenGL代碼而無需手動手動綁定每個擴展函數?

注:我知道我可以按照this回答提示和做到這一點:

auto functions = context->versionFunctions<QOpenGLFunctions_3_3_Core>(); 
if (!functions) error(); 
functions->initializeOpenGLFunctions(); 
functions->glGenBuffersARB(...); 

但後來我不得不對現有的OpenGL每一行代碼前加上functions->,我寧願不做。

+3

供參考:永遠不要使用'glGenBuffersARB'。 'glGenBuffers'已經成爲核心OpenGL的近十五年了。 –

+0

我剛剛意識到這一點,對不起這是一個非常糟糕的例子,但我認爲這個問題仍然很好。試想一下,我正在談論另一個與今天相關的擴展! (這是我現有的OpenGL代碼使用的擴展)。 –

回答

2

但是,然後我將不得不前綴現有的每一行OpenGL代碼functions->,我寧願不做。

你當然可以用QOpenGLContext::getProcAddress自己加載函數指針。但是Qt提供的唯一處理函數加載的接口是QOpenGLFunctions_*之一。不僅如此,它們並不包括擴展。

你可以使用Qt的OpenGL包裝類如QOpenGLBuffer等等。但是這些是最普通的分母。他們不會用現代OpenGL來包裝你所能做的所有事情。再次,他們不包括分機;只有核心功能的東西。

還有很多OpenGL沒有被這些對象所包裹,所以它不完全是一個全面的解決方案。

更好地堅持一個適當的OpenGL Loading Library

+1

從技術角度來說,包裝器'QOpenGLBuffer'是最小公分母。雖然不支持* all *可能的緩衝區對象功能,但它實際上會檢查擴展,所以它支持範圍映射。 (然後,它也有其他基本問題)。 QOpenGLTexture支持不可變的存儲,紋理視圖和類似的。 – peppe

+0

關於擴展,實際上有QtOpenGLExtensions庫('QT + = openglextensions'),你可以像使用'QOpenGLFunctions'一樣使用。像'auto f = new QOpenGLExtension_KHR_debug; F-> initializeOpenGLFunctions(); F-> glDebugMessage ...'。我不知道爲什麼它沒有記錄,可能是一個錯誤(因爲它是自動生成的)。 – peppe