2014-06-04 103 views
0

我有一個子功能,它讀取數據流並基於此創建一個頂點數據數組。主函數重複調用該子函數並更新頂點數據數組,然後將其綁定到緩衝區並繪製。到現在爲止還挺好。但是,我不知道如何添加頂點。 C++不會讓您重新分配或調整整個數組的大小。我不能使用矢量,因爲OpenGL函數需要數組,而不是矢量。OpenGL - 添加頂點

回答

3

您可以使用矢量來填充OpenGL頂點緩衝區。 vector中的值保證是連續的。見例如,對於細節這些討論對相關語言標準:

這意味着類似下面的代碼是安全的:

std::vector<GLfloat> vertexPositions; 
// Populate vector with vertex positions. 
GLuint bufId = 0; 
glGenBuffers(1, &bufId); 
glBindBuffer(GL_ARRAY_BUFFER, bufId); 
glBufferData(GL_ARRAY_BUFFER, vertexPositions.size() * sizeof(GLfloat), 
      &vertexPositions[0], GL_STATIC_DRAW); 

微妙但關鍵部分是你傳遞的地址的第一個元素矢量,而不是矢量對象的地址。

+0

有趣。來自Java背景,我沒有立即識別矢量 - >指針<->數組路徑。謝謝。 – user2258552

1

我會稍作修改。雖然可以使用頂點位置[0]作爲STL向量的開頭地址,但我更喜歡使用設計用於返回向量內存開始地址vertexPositions.data()的函數。

std::vector<GLfloat> vertexPositions; 
// Populate vector with vertex positions. 
GLuint bufId = 0; 
glGenBuffers(1, &bufId); 
glBindBuffer(GL_ARRAY_BUFFER, bufId); 
glBufferData(GL_ARRAY_BUFFER, vertexPositions.size() * sizeof(GLfloat), vertexPositions.data(), GL_STATIC_DRAW); 

由於許多原因,我使用STL向量來處理OGL數據。如果知道尺寸,預先分配很容易,添加項目時它們會增長(並保持連續)。它們很容易遍歷。如果您想傳遞交錯數據,您可以輕鬆創建結構向量。這一切都是一樣的。

+0

我沒有在答案中使用'data()'方法,因爲它只在C++ 11中引入,而另一種方法適用於所有版本的C++。無論如何,這看起來更像是評論而非答案。 –