【问题标题】:Share OpenGL code between Emscripten and Qt在 Emscripten 和 Qt 之间共享 OpenGL 代码
【发布时间】:2017-07-06 22:34:38
【问题描述】:

我想在我的基于 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>
}

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

【问题讨论】:

  • 我们有一个类似的话题:我们在 Qt 桌面应用程序中有一个 OpenGL 渲染库,我们想单独使用它(例如,用于 HMD 应用程序)。在玩弄了typedefs 等中QOpenGLFunctions 的各种复杂包装器定义之后,我终于使用了一个相当简单实用的解决方案。我得到了“官方头文件”(来自Khronos),为 GL 函数编写了自己的绑定(可能在 awk 的帮助下,但任何其他“智能”文本替换工具也可以)并使用它们而不是 Qt OpenGL东西。这工作正常。
  • 我忘了说,因为我在 Windows 上,所以我必须进行 OpenGL API 绑定。 (自 OpenGL 2 以来,MS 取消了对 OpenGL 的支持,以推广他们自己的 Direct3d 东西。)在其他系统上,例如Linux 我会直接使用 OpenGL API...
  • 当我们开始使用 Qt 绘画器进行 HUD 绘图时,事情变得有点复杂。意识到QPainter::beginNativePainting()QPainter::endNativePainting(),我在QPainter::drawText() 中遇到了一些崩溃。因此,我添加了代码以在 HUD 渲染之前恢复 OpenGL 状态(在我的代码中已更改)。最后,这解决了这个问题。 (Qt 内部渲染也可能使用 OpenGL,如果“你扰乱了它的状态”,它会非常敏感。)
  • 感谢您的意见!是的,Windows 部分是我以前的方法失败的地方。即使 windows-qt-builds 提供了 GLES-headers(通过 QtANGLE),编译失败......不幸的情况,但很高兴你找到了解决方案。

标签: c++ qt opengl emscripten


【解决方案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>
        }
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    • 2014-07-07
    • 1970-01-01
    • 1970-01-01
    • 2015-07-08
    • 2011-03-02
    • 2021-09-18
    相关资源
    最近更新 更多