我有一个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,偶尔会发生。统一不需要设置每一帧,所以我尝试只在用户输入槽中设置它,但它不起作用。统一保留它的值,这是在初始化时设置的。
我想这是因为渲染是异步的,并且统一无法在管道忙时更新。这就是为什么我试图拨打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
对象并返回。
我不知道上下文在'paintGL'中是当前的,但不是我定义的其他方法。所以你的回答很有帮助,谢谢!但是,只有少数几种方法才能使上下文流畅起来,这是什么原因呢?是否在一个应用程序中管理多个上下文?它不会显着减慢渲染速度吗? – Sergey
@Sergey:是的,这是关于在应用程序中有多个上下文的可能性。在默认的操作模式下,Qt为每个窗口创建一个单独的上下文(使用Qt5和新的OpenGL集成方式,您可以通过其他方式实现,但这不是非常简单)。所以如果围绕上下文有多个OpenGL窗口必须切换。除此之外,Qt5也可以使用OpenGL来渲染UI元素,而且您的小部件实际上已经结束于由Qt管理的FBO。 – datenwolf