在Emscripten和Qt

时间:2017-07-06 22:34:39

标签: c++ qt opengl emscripten

我想在我的基于Emscripten的前端(Webgl2又名GLES3.0)和我的Qt前端(OGL3.3)之间共享渲染代码,但如果可行,也不会介意GLES3.0 )。 两者都使用完全相同的GL调用,所以我想将所有调用移动到辅助函数,然后从前端调用它们。

问题在于,为了便携,我想在emscripten-part中调用GLES3/gl3.h中的函数,同时在Qt-part(或另一个同样可移植的解决方案)中使用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 个答案:

答案 0 :(得分: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>
        }
};