簡體   English   中英

opengl 3+緩沖操作

[英]opengl 3+ buffer operations

我對調用各種緩沖區函數時發生的過程感興趣,例如:

GLuint vertexbuffer;
glGenBuffers(1, &vertexbuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*power*12, g_vertex_buffer_data, GL_STATIC_DRAW);

在我正在遵循的教程中,在用坐標填充頂點數組之后調用它。 然后在主循環內部為每個幀調用:

glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0 );

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4*power);

glDisableVertexAttribArray(0);

如果緩沖區填充了常量值的數據,是否有必要在每次迭代中進行這些調用? 是不是可以在循環之前綁定緩沖區,設置glVertexAttribPointer並從緩沖區循環和繪制?

我會對每個調用發生的過程感興趣,例如哪一​​個指示cpu將緩沖區內的數據發送到gpu,它們停留多長時間(它們在渲染完成后重置?),是否可以緩沖區數據更改,如果一些值改變,則不重新綁定整個新緩沖區,這樣我就可以計算出在主循環內外進行哪些調用。

OpenGL是一個狀態機 ,因此在您明確請求更改之前,所有內容都將保持不變。 數據將通過glBufferData()調用復制到緩沖區中(至少從用戶的角度來看。當數據實際發送到GPU時,將完全控制GL實現。但就API而言,在返回glBufferData調用之后,可以認為數據存儲在該緩沖區對象中)。

只有在實際更改時,才需要為每次繪制調用重新設置頂點屬性指針。 請注意,當前綁定的GL_ARRAY_BUFFER的引用將成為glVertexAttribPointer()調用時屬性指針狀態的一部分 ,因此如果要從中繪制的VBO發生更改,則必須重新指定屬性指針,即使所有參數都是如此這個功能保持不變。 這也意味着,與一些常見的誤解相反,調用glDrawArrays時綁定哪個GL_ARRAY_BUFFER並不重要。

如果緩沖區填充了常量值的數據,是否有必要在每次迭代中進行這些調用? 是不是可以在循環之前綁定緩沖區,設置glVertexAttribPointer並從緩沖區循環和繪制?

可以將此狀態設置一次並在內循環中進行繪制調用 - 只要沒有其他繪制調用,則需要不同的屬性指針狀態。 請注意,在現代GL中,還有頂點數組對象封裝頂點屬性指針狀態,因此您可以只為對象(或對象組,或任何繪制調用)設置一次VAO,並且可以輕松切換通過簡單地再次綁定VAO來介於它們之間。

我會對每個調用發生的過程感興趣,例如哪一​​個指示cpu將緩沖區內的數據發送到gpu,

正如我已經提到的,GL API沒有公開這樣的實現細節,就像數據實際移動到GPU一樣(GL甚至不需要GPU,只有軟件實現)。 但是,發明了使用提示以幫助GL實現決定存儲緩沖區數據的位置。 GL_STATIC_DRAW可能只傳輸一次到GPU並存儲在VRAM中(如果有這樣的話)。

他們呆在那里多久(渲染完成后他們會重置嗎?),

沒有你請求它就沒有重置,“渲染完成”並不是一個有意義的概念。 什么時候會是這樣? 在內部,如果存在內存壓力,GL實現可能會選擇從VRAM中刪除一些緩沖區,但該過程對用戶完全透明。 緩沖區對象仍然存在且可用(但性能可能更差,但如果內存不足,這是無法避免的)。

如果一些值發生變化,緩沖區數據可以在不重新綁定整個新緩沖區的情況下進行更改,這樣我就可以計算出在主循環內外進行哪些調用。

我真的不完全理解這個問題。 即使綁定了新的緩沖區,緩沖區數據也不會改變。 它們是由GL管理的數據存儲緩沖區對象的整個概念,但內容完全在用戶的控制之下。 您可以更改緩沖區對象的幾個字節,而無需重新創建新的緩沖區對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM