調用glVertexPointer()
(和其他相關函數)時,使用堆棧中的頂點數組安全嗎?我不清楚OpenGL實際上是從傳入的結構中複製數據的。glVertexPointer()什麼時候複製數據?
如果不安全,那麼如何知道何時可以銷燬/重複使用傳遞給glVertexPointer()
的結構?
(不使用維也納組織)
調用glVertexPointer()
(和其他相關函數)時,使用堆棧中的頂點數組安全嗎?我不清楚OpenGL實際上是從傳入的結構中複製數據的。glVertexPointer()什麼時候複製數據?
如果不安全,那麼如何知道何時可以銷燬/重複使用傳遞給glVertexPointer()
的結構?
(不使用維也納組織)
在頂點數組的情況下,指針將的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);
}
glVertexPointer從來沒有拷貝數據,它只是設置一個指針,在你調用glDrawArrays和glDrawElements時讀取並傳輸給GPU,在這些函數返回後,數據可以安全地釋放。
錯!數據可以在glBufferData之後釋放,而不是在發出繪圖命令之後!避免誤導人們。 – spectre
@ lukasz1985這個問題提到他不使用VBOs,所以你的評論不適用。 –
要得到正確的答案,您應該添加如果您使用VBOs。 – pmr