所以我有一個動畫,我猜測我在用QT着色編碼的程序中的openGL。統一值和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(),但我不知道如何找到程序的句柄。乍一看,我的代碼看起來有效嗎?我擔心只要調用program-> setUniformValue是不夠的,因爲程序有頂點和片段着色器... @ReetoKoradi –
調用本身看起來很好。當你調用'setUniformValue()'時,我懷疑你的信號處理程序是在不同的線程中調用的,或者你的程序不是活動的程序。將更新時間存儲在類成員中似乎更安全,然後在重繪期間調用setUniformValue()調用。不知道Qt如何處理重繪,但如果它不能自行重繪,您可能還必須觸發重繪。 –