1つのシェーダープログラムで複数のウイドゲットに描画する方法を教えて下さい。
-
1つのシェーダープログラムで複数のウイドゲットに描画する方法を教えて下さい。
環境:
・Raspberry Pi CM4
・Debian10.11 32bit
・Qt4.11.3
・OpenGL ES 2.0内容:
一つのアプリケーションで4個のQGLWidgetを表示しようとしてます。
個々のQGLWidgetにQOpenGLFunctionsとQGLShaderProgramでシェーダープログラムを実装しています。この場合、下記クラスが4個メモリ上に占有される状態である。
QGLWidget
QOpenGLFunctions
QGLShaderProgramこれでは同じシェーダープログラムがウイドゲットの個数コンパイルされるので、余分なプログラムメモリを消費してしまうと思い、
私はQOpenGLFunctionsとQGLShaderProgramは各QGLWidget共通で使用できればと考えました。私は試しに
1個目のQGLWidgetのコンストラクタが呼ばれた時のみQOpenGLFunctionsとQGLShaderProgramのnewを実行。
2個目のQGLWidget以降の描画は、1個目にnewされたQOpenGLFunctionsとQGLShaderProgramを使用して描画するようにしました。
動作させた結果、1個目のQGLWidgetのみに描画され、2個目以降の
QGLWidgetには描画されない、意図した動作しませんでした。4画面とも表示可能な方法がありましたら教えて下さい。
また、私が作成してソースコードでは、QGLWidgetとQGLShaderProgramの間を関連付けるハンドルの受け渡しが無いように思いました。
Qtの中で暗黙的にハンドルの受け渡しがあるのでしょうか?以下ソースコード
class GlWindow
: public QGLWidget{Q_OBJECT
public:
GlWindow(QWidget *parent = nullptr){ if(m_renderer == nullptr){ m_renderer = new MyOpenGLFunctions(); } } ~GlWindow() override { if(m_renderer){ delete m_renderer; m_renderer = 0; } } void initializeGL() Q_DECL_OVERRIDE{ m_renderer->initializeGL(); } void paintGL() Q_DECL_OVERRIDE{ m_renderer->paintGL(); }
static MyOpenGLFunctions *m_renderer = nullptr;
};class MyOpenGLFunctions
: public QOpenGLFunctions{Q_OBJECT
public:
MyOpenGLFunctions(QObject *parent = nullptr); ~MyOpenGLFunctions(); void initializeGL(){ m_DrawerProgram->addShaderFromSourceFile(QGLShader::Vertex ,":/gl/LissaData.vsh"); m_DrawerProgram->addShaderFromSourceFile(QGLShader::Fragment ,":/gl/VertColor.fsh"); m_DrawerProgram->link(); } void paintGL(){ m_DrawerProgram.bind(); // :::: GL描画処理 :::: m_DrawerProgram.release(); } QGLShaderProgram m_DrawerProgram;
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);GlWindow gw[4]; gw[0] = new GlWindow(); gw[1] = new GlWindow(); gw[2] = new GlWindow(); gw[3] = new GlWindow(); gw[0].update(); gw[1].update(); gw[2].update(); gw[3].update(); return a.exec();
}