【发布时间】: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