我有一个RenderWidget
继承自 的类QOpenGLWidget
,它具有以下两种方法,其中包括:
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
uniform 不需要每帧都设置,所以我尝试只在用户输入槽中设置它,但它不起作用。制服保留了它的价值,这是在初始化时设置的。
我猜这是因为渲染是异步的,并且在管道繁忙时无法更新制服。这就是为什么我在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
对象并返回。