统一值和OpenGL着色器

时间:2015-05-04 03:53:17

标签: c++ qt opengl opengl-es shader

所以我想在一个程序中使用一个小动画,我在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);

}

然而,当我运行我的程序时,它会编译并执行,但无论我等待多久,计时器都不会更新。我的预感是,我没有用一种好方法更新着色器中的时间,我做错了什么?

1 个答案:

答案 0 :(得分:0)

我的猜测是你正在更新时间,但你没有重新绘制你的小部件。你应该调用在updateTime结束时重新绘制小部件的函数(我认为该函数的名称是repaint())。