2017-07-06 54 views
1

我想在基於Emscripten的前端(Webgl2又名GLES3.0)和我的Qt前端(OGL3.3)之間共享渲染代碼,但也不介意GLES3.0 ,如果可行的話)。 兩者都使用完全相同的GL-調用,所以我想將所有調用移動到隨後從前端調用的幫助函數。在Emscripten和Qt之間共享OpenGL代碼

的問題是可移植的,我想從在emscripten部分GLES3/gl3.h調用的函數,而在Qt的部分使用QOpenGLFunctions(或另一個同樣便攜式溶液):

guiwrapper.cpp :

#include <GLES3/gl3.h> 
void drawStuff(){ 
    glDrawArrays(...); // taken from <GLES3/gl3.h> 
} 

emscripten.cpp:

#include <guiwrapper.h> 
void someDrawFunc(){ 
    drawStuff(); // glDrawArrays pulled from <GLES3/gl3.h> 
    glDrawArrays(...); // also correctly uses <GLES3/gl3.h> version 
} 

qt.cpp:

class guiwidget: public QOpenGLWidget, protected QOpenGLFunctions{ 
public: 
    void paintGL(void); 
} 
void guiwidget::paintGL(){ 
    glDrawArrays(...); // correctly calls QOpenGLFunctions::glDrawArrays 
    drawStuff(); // still uses <GLES3/gl3.h> 
} 

有沒有可能實現這一點,而不寫所有的助手功能爲宏?

+1

我們也有類似的話題:我們有一個我們想要獨立使用的Qt桌面應用程序中的OpenGL渲染庫(例如,用於HMD應用程序)。在'typedef's等中使用了各種複雜的'QOpenGLFunctions'包裝器定義之後,我終於使用了一個相當簡單實用的解決方案。我得到了官方頭文件(來自[Khronos](https://www.khronos.org/)),爲GL函數編寫了一個自己的綁定(可能在awk的幫助下,但是任何其他「智能」文本替換工具都會並且使用它們來代替Qt OpenGL的東西。這工作正常。 – Scheff

+1

我忘了提及,我必須做OpenGL API綁定,因爲我在Windows上。 (自從OpenGL 2推出他們自己的Direct3d東西以來,MS已經取消了OpenGL支持。)在其他系統上Linux我會直接使用OpenGL API ... – Scheff

+1

當我們開始使用Qt畫家開始涉及HUD繪圖時,事情變得有點複雜。瞭解['QPainter :: beginNativePainting()'](http://doc.qt.io/qt-5/qpainter.html#beginNativePainting)和['QPainter :: endNativePainting()'](http:// doc.qt.io/qt-5/qpainter.html#endNativePainting),我在'QPainter :: drawText()'中出現了一些崩潰。因此,在HUD渲染之前,我添加了代碼來恢復OpenGL狀態(在我的代碼中進行了更改)。最後,這解決了這個問題。 (Qt內部渲染也可以使用OpenGL,如果「你打擾了它的狀態」則相當敏感。) – Scheff

回答

1

我現在發現了一個令人滿意的解決方案,這並不完全沒有預處理器魔法,但至少沒有宏或代碼重複。 也許它可以幫助別人:

guiwrapper.h:

#ifdef __EMSCRIPTEN__ 
#include <GLES3/gl3.h> 
class GuiWrapper 
#else 
#include <QOpenGLFunctions> 
class GuiWrapper: protected QOpenGLFunctions 
#endif 
{ 
    void drawStuff(void); // cpp decides between free and member-functions 
}; 

emscripten.cpp:

#include <guiwrapper.h> 
void someFunc(void){ 
    GuiWrapper gui; 
    gui.drawStuff(); // calls <GLES3/gl3.h> 
} 

glwidget.cpp:

#include <guiwrapper.h> 
#include <QOpenGLWidget> 
class GLWidget: public QOpenGLWidget, private GuiWrapper{ 
    public: 
     void paintGL(void){ 
      drawStuff(); // calls <QOpenGLFunctions> 
     } 
};