私は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>
}
すべてのヘルパー関数をマクロとして記述することなくこれを達成する可能性はありますか?
我々は同様のトピックを持っていた:私たちは持っていましたスタンドアローン(例えば、HMDアプリケーション用)を使用したいQtデスクトップアプリケーションのOpenGLレンダリングライブラリです。 'typedef'などで' QOpenGLFunctions'のさまざまな複雑なラッパー定義を使って遊んだ後、私はやっと単純で実用的な解決法を使用しました。私は "公式ヘッダーファイル"([Khronos](https://www.khronos.org/)から)を入手し、GL関数のための独自のバインディングを書きました(恐らくawkの助けを借りて、他の "インテリジェントな"同様に)Qt OpenGLの代わりにそれらを使用してください。これは正常に動作します。 – Scheff
私はWindows上にいるため、OpenGL APIバインディングを行う必要があることを忘れていました。 (MSは、OpenGL 2以降、OpenGLのサポートを取り消して、Direct3Dのものを宣伝している)。 Linux私は単純にOpenGL APIを直接使用します... – Scheff
Qtペインタを使用してHUD描画を開始したとき、状況が少し複雑になりました。 ['QPainter :: beginNativePainting()'](http://doc.qt.io/qt-5/qpainter.html#beginNativePainting)と['QPainter :: endNativePainting()'](http:// QPainter :: drawText()にいくつかのクラッシュがありました。したがって、HUDレンダリングの前にOpenGLの状態(コードで変更された状態)を復元するコードを追加しました。最後に、これが問題を解決しました。 (Qtの内部レンダリングもOpenGLを使用する可能性があり、 "あなたがその状態を妨害する"場合は非常に敏感です。) – Scheff