2017-07-06 5 views
1

私はEmscriptenベースのフロントエンド(Webgl2 aka GLES3.0)とQtフロントエンド(OGL3.3)の間でレンダリングコードを共有したいと思いますが、そこにGLES3.0も気にしません、可能であれば)。 両方ともまったく同じGL呼び出しを使用するので、フロントエンドから呼び出されるヘルパー関数にすべての呼び出しを移動したいと思います。EmscriptenとQtのOpenGLコードを共有する

問題は、Qtの部分(または別の、等しくポータブル溶液)でQOpenGLFunctionsを使用している間、私は、emscripten部分にGLES3/gl3.hから関数を呼び出したい、それが携帯可能である:

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

我々は同様のトピックを持っていた:私たちは持っていましたスタンドアローン(例えば、HMDアプリケーション用)を使用したいQtデスクトップアプリケーションのOpenGLレンダリングライブラリです。 'typedef'などで' QOpenGLFunctions'のさまざまな複雑なラッパー定義を使って遊んだ後、私はやっと単純で実用的な解決法を使用しました。私は "公式ヘッダーファイル"([Khronos](https://www.khronos.org/)から)を入手し、GL関数のための独自のバインディングを書きました(恐らくawkの助けを借りて、他の "インテリジェントな"同様に)Qt OpenGLの代わりにそれらを使用してください。これは正常に動作します。 – Scheff

+1

私はWindows上にいるため、OpenGL APIバインディングを行う必要があることを忘れていました。 (MSは、OpenGL 2以降、OpenGLのサポートを取り消して、Direct3Dのものを宣伝している)。 Linux私は単純にOpenGL APIを直接使用します... – Scheff

+1

Qtペインタを使用してHUD描画を開始したとき、状況が少し複雑になりました。 ['QPainter :: beginNativePainting()'](http://doc.qt.io/qt-5/qpainter.html#beginNativePainting)と['QPainter :: endNativePainting()'](http:// 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> 
     } 
}; 
関連する問題