2015-05-25 52 views
0

我知道glVertexAttribPointer將使用調用VBO時綁定的值。但是你能緩衝兩次到同一個對象上嗎?它會替代什麼?或者你可以清除一個緩衝區?我不知道這種方法是否正確:我應該使用相同的VBO來傳遞不同的頂點屬性嗎?或者我應該使用2?

glBindVertexArray(VAO); 

glBindBuffer(GL_ARRAY_BUFFER, VBO); // shared VBO 

glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); 
glEnableVertexAttribArray(posLoc); 
glVertexAttribPointer(posLoc, 3, GL_FLOAT, GL_FALSE, 3*sizeof(GLfloat),(GLvoid*)0); 


glBufferData(GL_ARRAY_BUFFER, sizeof(colours), colours, GL_STATIC_DRAW); 
glEnableVertexAttribArray(colLoc); 
glVertexAttribPointer(colLoc, 4, GL_FLOAT, GL_FALSE, 4*sizeof(GLfloat),(GLvoid*)0); 

glBindBuffer(GL_ARRAY_VERTEX, 0); 
glBindVertexArray(0); 

或者如果我應該使用2個VBO緩衝數據。如果您將glBufferData函數調用兩次給同一個綁定的頂點數組對象,會發生什麼?這是其他方式,我會想到這樣做:

glBindVertexArray(VAO); 

glBindBuffer(GL_ARRAY_BUFFER, VBO1); // VBO for vertices 

glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); 
glEnableVertexAttribArray(posLoc); 
glVertexAttribPointer(posLoc, 3, GL_FLOAT, GL_FALSE, 3*sizeof(GLfloat),(GLvoid*)0); 

glBindBuffer(GL_ARRAY_BUFFER, VBO2); // VBO for colours 

glBufferData(GL_ARRAY_BUFFER, sizeof(colours), colours, GL_STATIC_DRAW); 
glEnableVertexAttribArray(colLoc); 
glVertexAttribPointer(colLoc, 4, GL_FLOAT, GL_FALSE, 4*sizeof(GLfloat),(GLvoid*)0); 

glBindBuffer(GL_ARRAY_BUFFER, 0); 
glBindVertexArray(0); 

回答

1

頂部例子也不會達到第二glBufferData通話將覆蓋所有的緩衝空間,在第二個工作。爲了正確地做到這一點,您必須正確使用步長和指針參數,以便數據交錯。只需擁有多個VBO,每個VBO都存儲一組單獨的數據,這樣更容易(也更簡潔)。

+0

感謝您的回答。我知道你的意思,但我想我們是否可以使用多個維也納組織。那麼每個VAO只有1個VBO嗎?我也聽說我也可以使用'glBufferSubData'。事情是我想保持頂點attirbutes在sepparate C++數組中並單獨緩衝它們。所以我想我需要使用'glBufferSubData'? –

+0

針對VAO的多個VBO是我的建議(也許我的回答沒有說​​清楚,我會更新它),這就是你在第二個例子中所做的。 'glBufferSubData'用於更新VBO的一部分,對於更新現有VBO非常有用,但通常不用於初始化它(除非數據非常大,並且您可能想要遞增發送) –

+0

ok我明白了: D謝謝。那麼第二個例子呢?我看到其他人的方法,我認爲它也會起作用。我在這個文件中看到它https://github.com/BennyQBD/ModernOpenGLTutorial/blob/master/mesh.cpp –