2013-01-09 97 views
2

我想加載一個對象並使用VBO和glDrawArrays()來渲染它。問題是像我的情況下,一個簡單的浮點指針如float f[]={...}不起作用,因爲我通過了該指針可以存儲的值的限制。所以我的解決方案是使用矢量。而且它不工作...OpenGL:使用VBO與std :: vector

這裏是我的代碼:

unsigned int vbo; 
vector<float*> vert; 

... 
vert.push_back(new float(i*size)); 
vert.push_back(new float(height*h)); 
vert.push_back(new float(j*size)); 
... 

glGenBuffers(1, &vbo); 
glBindBuffer(GL_ARRAY_BUFFER, vbo); 
glBufferData(GL_ARRAY_BUFFER, sizeof(vert), &vert, GL_STATIC_DRAW); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

和渲染:

glBindBuffer(GL_ARRAY_BUFFER, vbo); 
glEnableClientState(GL_VERTEX_ARRAY); 
glVertexPointer(3, GL_FLOAT, 0, 0); 
glDrawArrays(GL_TRIANGLE_STRIP, 0, 3); 
glDisableClientState(GL_VERTEX_ARRAY); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

我在glBufferData()其中第三個參數爲const GLvoid *data有問題。我通過&vert但它不起作用。

回答

13

你想做的事:

unsigned int vbo; 
vector<float> vert; 

... 
vert.push_back(i*size); 
vert.push_back(height*h); 
vert.push_back(j*size); 
... 

glGenBuffers(1, &vbo); 
glBindBuffer(GL_ARRAY_BUFFER, vbo); 
glBufferData(GL_ARRAY_BUFFER, vert.size() * sizeof(float), vert.data(), GL_STATIC_DRAW); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

這是一件好事讀documentation。另外,我建議你選擇一本好的C++書籍,這對你來說可能是避免犯這類錯誤的好辦法。

+0

非常感謝。 –

+3

爲了更好的可移植性,最好使用'vert.size()* sizeof(float)'作爲size參數。 – Kevin

+0

@Kevin事實上,使用vert.size()根本不起作用。只有1/4的VBO將被呈現 – KaareZ

4

記得檢查一下你是否有C++ 11或vert.data不能編譯。

如果你看std::vector文檔,你會發現std::vector::data()標籤爲C++ 11。

http://www.cplusplus.com/reference/vector/vector/data/

如果不具有C++ 11可以執行以下操作:

unsigned int vbo; 
vector<float> vert; 

... 
vert.push_back(i*size); 
vert.push_back(height*h); 
vert.push_back(j*size); 
... 

glGenBuffers(1, &vbo); 
glBindBuffer(GL_ARRAY_BUFFER, vbo); 
glBufferData(GL_ARRAY_BUFFER, vert.size(), &vert[0], GL_STATIC_DRAW); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

隔空參照向量的第一元素給出您的指針數據本身。

+0

我已經嘗試過了,但沒有奏效。但是我有C++ 11,因此數據是解決方案 –

+0

你試過'&vert [0]'嗎?你正在使用哪種編譯器?在C++ 11之前,我所有的代碼都使用這種形式並且工作正常。 – McLeary

+0

哦,我找到了解決方案。正確的做法是'vert.data()'或'&(vert [0])'。 '&vert [0]'不適合我 –