поэтому у меня есть небольшая анимация. Я предполагаю, что в openGL в программе я кодирую шейдеры в QT.равномерные значения и шейдеры OpenGL
Моя анимация изменена как функция времени. Чтобы рассчитать время, я использовал таймер в слоте, который будет многократно обновлять время.
У меня Qwidget, мой вершинный шейдер очень простой, поэтому я не буду включать код.
теперь мой пиксельный шейдер:
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);
}
и, наконец, как я использую его:
timeTimer=new QTimer();
QObject::connect(timeTimer, SIGNAL(timeout()),this, SLOT(updateTime()));
timeTimer->start(20);
Однако, когда я бегу мой программа компилирует и выполняет, но таймер не обновляется, независимо от того, как долго я жду. Моя догадка заключается в том, что я не использую хороший способ обновить время в моем шейдере, что я делаю неправильно?
Я не знаю, как работает этот материал сигнала Qt, но вам нужно убедиться, что метод 'updateTime()' вызывается в том же потоке, из которого вы выполняете рендеринг. В противном случае нет текущего контекста OpenGL, когда вы пытаетесь установить равномерное значение. –
Я попытался использовать glGetUniformLocation(), но я не знаю, как найти дескриптор программы. Действительно ли мой код выглядит на первый взгляд? Я был обеспокоен тем, что просто вызвать программу-> setUniformValue было недостаточно, так как программа имеет как вершинный, так и фрагментарный шейдер ... @RetoKoradi –
Сам вызов выглядит нормально. Я подозреваю, что ваш обработчик сигнала либо вызывается в другом потоке, либо ваша программа не является активной программой, когда вы вызываете 'setUniformValue()'. Казалось бы, безопаснее просто сохранить обновленное время в члене класса, а затем сделать вызов 'setUniformValue()' во время вашего перерисовки. Не знаете, как Qt обрабатывает перерисовки, но вам также может понадобиться вызвать перерисовку, если она не будет постоянно перерисовываться сама по себе. –