2011-08-08 45 views
8

調用glVertexPointer()(和其他相關函數)時,使用堆棧中的頂點數組安全嗎?我不清楚OpenGL實際上是從傳入的結構中複製數據的。glVertexPointer()什麼時候複製數據?

如果不安全,那麼如何知道何時可以銷燬/重複使用傳遞給glVertexPointer()的結構?

(不使用維也納組織)

+2

要得到正確的答案,您應該添加如果您使用VBOs。 – pmr

回答

6

在頂點數組的情況下,指針將的glDrawElements()和朋友執行期間取消引用,假定GL_VERTEX_ARRAY一直glEnableClientState()編輯。

只要glDrawElements()返回OpenGL將有它需要的所有數據,所以你可以免費使用free()

對於在一個真正的指針從來沒有過維也納組織,所以它並沒有真正的問題:)

所以這樣的事情應該工作:

void draw() 
{ 
    vector<float> verts; 
    verts.push_back(0); 
    verts.push_back(0); 
    verts.push_back(0); 
    verts.push_back(10); 
    verts.push_back(0); 
    verts.push_back(0); 
    verts.push_back(10); 
    verts.push_back(10); 
    verts.push_back(0); 

    glEnableClientState(GL_VERTEX_ARRAY); 
    glVertexPointer(3, GL_FLOAT, 0, &verts[0]); 
    glDrawArrays(GL_TRIANGLES, 0, 3); 
    glDisableClientState(GL_VERTEX_ARRAY); 
} 
1

glVertexPointer從來沒有拷貝數據,它只是設置一個指針,在你調用glDrawArrays和glDrawElements時讀取並傳輸給GPU,在這些函數返回後,數據可以安全地釋放。

+1

錯!數據可以在glBufferData之後釋放,而不是在發出繪圖命令之後!避免誤導人們。 – spectre

+3

@ lukasz1985這個問題提到他不使用VBOs,所以你的評論不適用。 –

相關問題