2017-01-21 31 views
1

我有一個簡單的2D三角形顯示在屏幕上,我要更新的顏色緩衝數據的每一幀,所以三角形的顏色不斷變化,但林不知道如何有效地更新數據。如何頻繁地更新頂點緩衝數據(每幀)的OpenGL

這是顏色緩衝區代碼:

GLfloat colourVert[] = { 
     0.0f, 1.0f, 0.0f, 
     1.0f, 0.0f, 0.0f, 
     0.0f, 0.0f, 1.0f 
    }; 



GLuint colourBuffer; 
glGenBuffers(1, &colourBuffer); 
glBindBuffer(GL_ARRAY_BUFFER, colourBuffer); 
glBufferData(GL_ARRAY_BUFFER, sizeof(colourVert), colourVert, GL_DYNAMIC_DRAW); 
glEnableVertexAttribArray(1); 
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0); 

我需要在這些行添加的東西還是需要修改着色器,可有人解釋,請,謝謝您的幫助。

+1

你應該決定你想要哪種類型的OpenGL,因爲答案很大程度上取決於這個。並請說明哪個版本。例如,es 3.0使用VAO來存儲屬性綁定,而2.0則不使用。 – BDL

+0

@BDL在IOS中,opengl 2.0完全支持VAO,但不支持Android – Sung

回答

4

你絕對不應該產生一個新的緩衝每一幀。只需重用已有的即可。由於它們存儲在VAO中,因此也可以只設置一次屬性指針。僅有的兩條線路實際需要的是glBindBufferglBufferData(甚至更好的使用glBufferSubData,因爲這將重新使用已分配的內存,而不是分配一個新的內存段)。

注意,這個答案只適用於OpenGL的3.3核心(和更高版本)和OpenGL-ES 3.0(及更高版本)。對於不支持/需要VAO的OpenGL版本,屬性設置可能也必須發生在每一幀中。

+0

使用VAO與否無關緊要。無論哪種情況,我們只需要更新維也納國際組織,而不是VAOs。 – Sung

+0

@Sung:我從來沒有說過你必須更新VAO。我說:「如果你使用VAO,你不應該每幀調用'glVertexAttribPointer',因爲這個設置是以vao狀態存儲的。 – BDL

+0

你說「還設置屬性指針也可以做一次就好,因爲它們被存儲在VAO」「注意,這個答案只適用於OpenGL的3.3核心(及更高版本)和OpenGL-ES 3.0」的前提是,他是使用不需要提及的VAO。 – Sung