2015-05-04 2 views
0

поэтому у меня есть небольшая анимация. Я предполагаю, что в 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); 

Однако, когда я бегу мой программа компилирует и выполняет, но таймер не обновляется, независимо от того, как долго я жду. Моя догадка заключается в том, что я не использую хороший способ обновить время в моем шейдере, что я делаю неправильно?

+2

Я не знаю, как работает этот материал сигнала Qt, но вам нужно убедиться, что метод 'updateTime()' вызывается в том же потоке, из которого вы выполняете рендеринг. В противном случае нет текущего контекста OpenGL, когда вы пытаетесь установить равномерное значение. –

+0

Я попытался использовать glGetUniformLocation(), но я не знаю, как найти дескриптор программы. Действительно ли мой код выглядит на первый взгляд? Я был обеспокоен тем, что просто вызвать программу-> setUniformValue было недостаточно, так как программа имеет как вершинный, так и фрагментарный шейдер ... @RetoKoradi –

+0

Сам вызов выглядит нормально. Я подозреваю, что ваш обработчик сигнала либо вызывается в другом потоке, либо ваша программа не является активной программой, когда вы вызываете 'setUniformValue()'. Казалось бы, безопаснее просто сохранить обновленное время в члене класса, а затем сделать вызов 'setUniformValue()' во время вашего перерисовки. Не знаете, как Qt обрабатывает перерисовки, но вам также может понадобиться вызвать перерисовку, если она не будет постоянно перерисовываться сама по себе. –

ответ

0

Я предполагаю, что вы правильно обновляете время, но вы не перерисовываете свой виджет. Вы должны вызвать функцию, которая повторно рисует виджет в конце updateTime (я думаю, что имя этой функции - repaint()).

+0

спасибо, я попробовал добавить обновление и перерисовать, но я не думаю, что это проблема. Я думаю, лучший вопрос может состоять в том, как мне отлаживать это? Я не знаю, как пройти через шейдерный код, который я дал –