所以我有一個系統(使用OpenGL 4.x的)我在哪裏接收點(潛在地與顏色和/或正常)的流,從外部源。我需要將這些點繪製爲GL_POINTS,運行用於着色的自定義可切換着色器(可以程序化地生成顏色,或者來自頂點顏色或正常方向)。最快方式,以及去除偶爾
該流包括以相當規律的間隔(4到10赫茲)接收任意數量(典型的從1k到70k點)的一組點(有或沒有正常或顏色),我需要添加這些指向我目前的分數,並畫出迄今得分的所有分數。我保證我的頂點類型不會改變,我在流媒體開始時會告訴我,所以我要麼使用交錯頂點:pos + normal + color,pos + normal,pos +顏色,或只是pos。
我當前的解決方案是分配交織頂點維也納各組織(包括周圍VAOs)在一個配置文件中的相應頂點類型的指定的最大頂點計數(與動態分配的提示)。
進來我作爲新的點填滿我通過glBufferSubData充滿VBO當前非。我保留了當前邊界VBO到目前爲止有多少頂點的計數(activePoints),並且如果我當前的更新組的頂點數超過了我的邊界緩存區的頂點數,則使用glBufferSubData填充以activePoints開始的範圍(因爲我限制每個VBO的頂點計數),然後我分配一個新的VBO,並填充從0開始的範圍,結束於我的更新組中剩餘的點數(未添加到最後一個緩衝區),如果我仍然有點剩餘我一次又一次地做這個。更新組跨越2個緩衝區很少見。
渲染時,我使用glDrawArrays(m_DrawMode,0,numVertices)渲染所有VBO(-1),其中numVertices等於最大緩衝區允許大小,我的邊界緩衝區使用glDrawArrays(m_DrawMode,startElem,numElems)以說明它沒有完全充滿有效頂點。
當然,在某些情況下,我會有比我可以交互式繪製的更多的點數,所以我有一個LRU機制,根據需要釋放最老的(根據LRU alg)一組VBO。
有沒有更好的方法來做到這一點?緩衝液孤兒?流媒體提示?地圖與子數據?還有別的嗎?
的第二個問題是,我現在要求刪除的點(不定期),每次10〜2000。但是這些點在我最初收到的順序內是不規則的。我可以找出它們當前在哪些緩衝區中的偏移量,但它更多的是散射而不是範圍。我一直在「去除它們」,方法是找到它們的偏移量,放入正確的緩衝區,然後逐個調用範圍爲1的glBufferSubData(它們很少,它們在緩衝區中彼此相鄰),然後將其更改爲遠離其中的位置他們永遠不會被看到。最後我想緩衝區應該從這些刪除請求中刪除,但我目前沒有這樣做。
什麼是更好的方法來處理?
我不強烈建議你使用'glDrawElements(...)'來代替未使用的頂點。然後你傳遞一個實際上有數據的所有點的數組。您可以在內部保留未使用或自由頂點的列表,但是您絕對會浪費總線帶寬來清除自由頂點。只是讓他們像他們一樣,但承認他們不會被渲染/包含垃圾:) –
所以你建議我創建一個刪除並創建一個新的VBO填充索引(或真正的IBO),每次說4點需要刪除緩衝區中的300k?然後用glDrawElements繪製,與glDrawArrays一樣? – Ryan
不完全。我建議你給頂點緩衝區分配一個大小相等的IBO,最初它會依次填充0-n(其中n是你的VBO大小)的值。當你想在一個隨機位置或者一系列連續頂點上移除一個頂點時,只需使用'glBufferSubData(...)'並用指向有效頂點的索引替換IndexArray [n]處的值即可。通過這種方式,不必重新定義頂點位置,或者添加一個32位的w座標以便在渲染時「隱藏」去除的頂點,那麼您只需重新定義16位索引即可脫身。 –