2016-08-19 21 views
2

比方說,我有頂點數組和VBO指針:OpenGL:緩衝到VBO後仍然需要一個頂點數組嗎?

std::vector<Vertex> vertices; 
GLuint vbo; 
glBindBuffer(GL_ARRAY_BUFFER, vbo); 

現在我緩存數據:

glBufferData(
    GL_ARRAY_BUFFER, 
    vertices.size()*sizeof(Vertex), 
    &vertices[0], 
    GL_STATIC_DRAW 
); 

如果我理解這個正確我仍然需要保持頂點數組因GL_STATIC_DRAW。但是,如果我將其更改爲GL_STATIC_COPY,則所有數據都將被複制到GPU的內存中,這樣我就可以釋放由vertices使用的內存。那是對的嗎?如果是這種情況,爲什麼我們需要*_DRAW?這是有用的,因爲GPU的內存限制?再加上GL_STATIC_READ真的有效嗎?

回答

6

所有這些都在glBufferData()手冊頁中進行了說明。

https://www.opengl.org/sdk/docs/man/html/glBufferData.xhtml

你並不需要保持一個額外的副本在你的程序的內存。 glBufferData()的全部目的是將程序中的數據複製到OpenGL緩衝區,一旦複製完成,您可以使用程序存儲器執行任何您想要的操作。

如果數據不是NULL,則數據存儲將使用該指針的數據進行初始化。

請勿使用GL_STATIC_COPY,這是不正確的。文檔讀取:

COPY

數據存儲內容由從GL讀取數據修改,以及用作源爲GL繪圖和圖像規格的命令。

所以GL_STATIC_COPY只適用於不同OpenGL緩衝區之間的內部拷貝,不適用於從應用程序到OpenGL的拷貝。使用DRAW

相關問題