所以我想在一个程序中使用一个小动画,我在QT中使用着色器进行编码。
我的动画随时间而变化。为了计算时间,我在插槽中使用了一个反复更新时间的计时器。
我有一个Qwidget,我的顶点着色器很简单所以我不会包含代码。
现在为我的片段着色器:
passthroughViews
然后我的时间更新方法:
QOpenGLShader *fshader = new QOpenGLShader(QOpenGLShader::Fragment, this);
const char *fsrc =
"uniform float time;\n"
"in vec4 coordinates;\n"
"out vec4 outcolor;\n"
"void main(void)\n"
"{\n"
" float l,z=time;"
" outcolor=vec4(coordinates * time);" //<- pretend i did something with time here
"}\n";
fshader->compileSourceCode(fsrc);
最后我如何使用它:
void MyWidget::updateTime()
{
float seconds;
seconds = (float) ((double) clock() - startTime) / CLOCKS_PER_SEC;
program->setUniformValue("time", (float) seconds / (float) CLOCKS_PER_SEC);
}
然而,当我运行我的程序时,它会编译并执行,但无论我等待多久,计时器都不会更新。我的预感是,我没有用一种好方法更新着色器中的时间,我做错了什么?
答案 0 :(得分:0)
我的猜测是你正在更新时间,但你没有重新绘制你的小部件。你应该调用在updateTime结束时重新绘制小部件的函数(我认为该函数的名称是repaint())。