2014-12-05 122 views
0

所以,我渲染了一堆立方體;就像,屏幕上會立刻有成千上萬的立方體。問題是,計算每個立方體的每個幀的轉換矩陣,結果並不十分有效:1,000個立方體以54 fps呈現,10,000立方以6 fps呈現。我需要能夠改變這些轉換矩陣,因爲玩家將能夠遍歷它們。OpenGL:高效地計算變換矩陣

這裏是我的渲染代碼:

void Tester::render() 
{ 
    for (int i = 0; i < numInstances; i++) 
     transforms[i] = Commons::PERSPECTIVE_MATRIX * translations[i]; 

    glBindBuffer(GL_ARRAY_BUFFER, m_transformationMatrixBuffer); 
    glBufferData(GL_ARRAY_BUFFER, numInstances * sizeof(glm::mat4), &transforms[0], GL_DYNAMIC_DRAW); 

    for (int i = 0; i < 4; i++) 
    { 
     glVertexAttribPointer(MVP_LOC + i, 4, GL_FLOAT, GL_FALSE, sizeof(glm::mat4), (const void*)(sizeof(float) * i * 4)); 
     glEnableVertexAttribArray(MVP_LOC + i); 
     glVertexAttribDivisor(MVP_LOC + i, 1); 
    } 

    glDrawElementsInstanced(GL_TRIANGLES, m_numIndexDataElements, GL_UNSIGNED_SHORT, 0, numInstances); 
} 

基本上,我的問題是:我怎麼能有效地計算變換矩陣的每個多維數據集實例?

+0

爲什麼你認爲你需要調整矩陣計算?你有沒有分析?如果你願意,你可能會感到驚訝。另一件事:你是否真的需要改變每一幀所有10k對象的變換?另外,使用VAO。 – Drop 2014-12-05 05:35:57

+0

你能否通過調整矩陣計算來解釋你的意思?你可能沒有必要改變每幀10k的變換,但我需要改變至少1k的變換。我會實施VAO。 – hacksoi 2014-12-05 06:05:35

+0

通過調整矩陣我的意思是你問的問題:「高效地計算變換矩陣」。在進行任何優化之前請[profile](http://en.wikipedia.org/wiki/Profiling_%28computer_programming%29)。 – Drop 2014-12-05 06:21:40

回答

0

有一個操作會很慢:第一個for循環。相反,只需傳遞Commons::PERSPECTIVE_MATRIX作爲統一標準,並且只是屬性中的翻譯部分。

然後在頂點着色器中,您將它們相乘然後應用到頂點。

如果您還需要每個實例的輪換,我建議爲此傳遞一個四元數。