Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. Japanese
  4. 1つのシェーダープログラムで複数のウイドゲットに描画する方法を教えて下さい。
Forum Updated to NodeBB v4.3 + New Features

1つのシェーダープログラムで複数のウイドゲットに描画する方法を教えて下さい。

Scheduled Pinned Locked Moved Unsolved Japanese
1 Posts 1 Posters 409 Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • S Offline
    S Offline
    sh1981
    wrote on last edited by
    #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();
    

    }

    1 Reply Last reply
    0

    • Login

    • Login or register to search.
    • First post
      Last post
    0
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Get Qt Extensions
    • Unsolved