2012-01-11 42 views
5

我通過構建或修改緩存區來呈現場景,我給glBufferData。我對頂點數組對象的理解是,它們允許我跳過手動綁定所有使用的VBO。當我更新我的緩衝區時,情況仍然如此嗎?如果我需要更換VBO,是否需要重建我的VAO?

我可以綁定我的VAO,調用glBufferData更新頂點和索引(我目前只有兩個VBO),然後渲染?

我可以在VBO中使用內存映射嗎?然後我可以綁定VAO,修改緩衝區,然後渲染?

VAO究竟做了什麼?其功能僅僅是一個存儲和自動將頂點屬性綁定到VBO的快捷方式嗎?它是否擁有數據或綁定的所有權?

回答

3

您可能需要測試一下,但根據我的理解,VBO在生成時會給出ID,而VAO只會引用每個頂點attrib以及它正在使用的VBO ID。您應該能夠撥打glBufferDataglBufferSubData。我不確定在繪製調用之前的內存映射是否可行,但你可以在綁定VAO和繪圖之間做一些事情。 VAO不鎖定VBOs或限制對它們的訪問。一般來說,VAO只是存儲屬性及其所有設置(綁定VBO,跨度,偏移量等),並在綁定時自動綁定屬性。在您撥打glBindVertexArray(0);之前,所有頂點屬性都綁定到綁定的VAO。

+0

因此,VAO不會影響我綁定哪個VBO?我需要綁定它們並在它們上調用'glBufferData'。 – 2012-01-11 14:04:24

+0

@Robert Rouhani考慮到你的頂點佈局對於大多數繪製都是相同的,我覺得你必須爲每個VBO存儲一組不同的頂點屬性。我花了一段時間試圖避免這一點,但沒有得到任何地方。 – Zebrafish 2016-11-27 06:41:47

+0

@TitoneMaurice佔用的空間量應該是最小的(按字節順序),額外的GL調用綁定不同的屬性不應該是你的瓶頸。最想做的事情就是實例化,在我看來,其他任何東西都是不必要的/過早的優化。 – 2016-11-27 15:55:52

相關問題