c++ - 在 Emscripten 和 Qt 之间共享 OpenGL 代码

标签 c++ qt opengl emscripten

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

问题是为了便于移植,我想在 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>
}

是否有可能在不将所有辅助函数都编写为宏的情况下实现这一目标?

最佳答案

我现在找到了一个令人满意的解决方案,它并非完全没有预处理器魔法,但至少既没有宏也没有代码重复。 也许它可以帮助某人:

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>
        }
};

关于c++ - 在 Emscripten 和 Qt 之间共享 OpenGL 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44959905/

相关文章:

c++ - QGraphicsItem 上的事件过滤器

c++ - 子窗口中的多线程 OpenGL

opengl - GLSL 距离场透明度

c++ - cpp 和 C 中非法除以零异常

c++ - 通过HttpOpenRequestA发送POST数据

c++ - 如何使用QColumnView显示多列数据

windows - Qt Webengine 渲染打印

c++ - 无法在 OpenGL 中获取矩形的 3D View

c++ - 演示制作者如何获得超小文件大小?

c++ - 使用 mpicxx 时由于 _noalias 导致 OpenMPI 构建失败