0

RenderWidgetから継承したクラスがQOpenGLWidgetあり、特に次の 2 つのメソッドがあります。

RenderWidget : public QOpenGLWidget, protected QOpenGLFunctions_4_3_Core {
    // ...
public slots:
    void setSmthEnabled(bool enabled) {
        float val = (enabled == true) ? 1.0f : 0.0f;
        shader.setUniformValue("uniformUserInput", val);
    }

public:
    void paintGL() {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        // ...
        shader.setUniformValue("uniform1", value1);
        shader.setUniformValue("uniform2", value2);
        // ...
        mesh->draw();
    }
};

paintGLは毎秒 100 回呼び出されsetSmthEnabledますが、ユーザーが UI のチェックボックスを切り替えたときにのみ呼び出されますが、これはときどき発生します。uniformUserInputユニフォームはフレームごとに設定する必要がないので、ユーザー入力スロットだけに設定しようとしましたが、うまくいきません。ユニフォームは、初期化時に設定された値を保持します。

これは、レンダリングが非同期であり、パイプラインがビジー状態である間はユニフォームを更新できないために発生すると推測されます。そのため、スロットglFinish()にセットする前にコールしようとしましたが、役に立ちませんでした。私が見つけた唯一の解決策は、次の方法でクラスを書き直すことです。uniformUserInputsetSmthEnabled

RenderWidget : public QOpenGLWidget, protected QOpenGLFunctions_4_3_Core {
    // ...
private:
    float val = 1.0f;

public slots:
    void setSmthEnabled(bool enabled) {
        val = (enabled == true) ? 1.0f : 0.0f;
    }

public:
    void paintGL() {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        // ...
        shader.setUniformValue("uniform1", value1);
        shader.setUniformValue("uniform2", value2);
        // ...
        shader.setUniformValue("uniformUserInput", val);
        mesh->draw();
    }
};

実際のコードには、より多くのユーザー入力ユニフォームが含まれているため、フレームごとにそれらすべてを更新して、その目的のために冗長なメンバー変数を保持したくはありません。ユーザー入力のみでユニフォームを更新するにはどうすればよいですか?

shader.setUniformValue上記のコアではQOpenGLShaderProgram::setUniformValue、関連するQOpenGLShaderProgramオブジェクトのみを呼び出して返します。

4

1 に答える 1