2015-05-04 103 views
0

所以我有一個動畫,我猜測我在用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); 

然而,當我運行程序編譯並執行,但是不管更新多久,定時器都不會更新。我的直覺是,我沒有使用一種好的方法來更新着色器中的時間,我做錯了什麼?

+2

我不知道這個Qt信號如何工作,但是您需要確保''updateTime()'方法在您渲染的同一個線程中被調用。否則當你嘗試設置統一值時,沒有當前的OpenGL上下文。 –

+0

我試圖使用glGetUniformLocation(),但我不知道如何找到程序的句柄。乍一看,我的代碼看起來有效嗎?我擔心只要調用program-> setUniformValue是不夠的,因爲程序有頂點和片段着色器... @ReetoKoradi –

+0

調用本身看起來很好。當你調用'setUniformValue()'時,我懷疑你的信號處理程序是在不同的線程中調用的,或者你的程序不是活動的程序。將更新時間存儲在類成員中似乎更安全,然後在重繪期間調用setUniformValue()調用。不知道Qt如何處理重繪,但如果它不能自行重繪,您可能還必須觸發重繪。 –

回答

0

我的猜測是你正在更新時間,但你沒有重新繪製你的小部件。你應該調用在updateTime結束時重新繪製小部件的函數(我認爲該函數的名稱是repaint())。

+0

謝謝,我試圖添加更新和重繪,但我不認爲這是問題。我想更好的問題可能是我應該如何調試?我不知道有什麼方法可以通過我給出的着色器代碼 –