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()
にセットする前にコールしようとしましたが、役に立ちませんでした。私が見つけた唯一の解決策は、次の方法でクラスを書き直すことです。uniformUserInput
setSmthEnabled
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
オブジェクトのみを呼び出して返します。