2014-12-06 160 views
0

我正在實現一個帶有「時間軸」的QT OpenGL應用程序,該程序允許用戶通過一些動畫3D幾何體進行掃描 - 即清理時間線應觸發導致VBO數據重新綁定的事件它被正確地重新繪製。快速修改OpenGL VAO緩衝區

我只能重新綁定在時間軸上兩個時間點之間更改的內存部分(聚合兩個時間點之間的所有增量),但看起來相當昂貴。天真地只要在時間點變化事件中重新綁定所有VBO數據並記錄存儲器中每幀的所有VBO數據就夠了嗎?

+1

另請參閱:https://www.opengl.org/wiki/Buffer_Object_Streaming – 2014-12-06 18:50:04

回答

0

(我假設在這裏,你單獨動畫頂點,而不是用骨頭之類的東西,帶骨頭的情況是相似的。)

問題是,具有VBO的每個完整副本幀是一大堆內存。

理想情況下,您希望獲得的關鍵幀列表中每個關鍵幀都有時間,由關鍵幀將其作爲矢量+偏移列表和插值數據進行動畫的頂點列表。你發送給頂點着色器的是VBO之前的「VBO」,以及「之後的VBO」。然後,頂點着色器進行插值。

這樣,當你洗刷一個點時,你只需要glBufferSubData VBO之前和之後不同的部分(即,你已經通過的每個關鍵幀,如果有的話)和glUniform1f alpha。您可以採取一些啓發式措施以避免過多的呼叫,即在您進行5次以上呼叫時重新發送整個緩衝區。

+0

如果每個幀都有關鍵幀會怎麼樣?我並不完全使用動畫數據,更像是延時的FMRI序列。 – ejang 2014-12-06 18:46:57