2013-11-27 24 views
2

我剛剛開始學習C++中的頂點緩衝區對象。我正在讀一本關於openGL的書,其中說vbo渲染比其他形式的渲染更有效,因爲數據存儲在gpu而不是堆上,但是我很困惑,如果你仍然需要加載從堆到gpu的數據陣列。每隔幾秒鐘,我更新我的程序的頂點數據,這意味着我必須使用glBufferData刷新數據以更新到新狀態。我沒有看到這比僅僅正常渲染數組更有效。我想知道是否我要調用glBufferData,或者如果有更好的方法直接在GPU上更新頂點數據。何時使用glBufferData打開gl

+0

您是通過全新的緩衝區發送還是隻發生了什麼變化?另外,你爲什麼要發送一個新的緩衝區?如果是動畫,請考慮將動畫的「關鍵幀」作爲多個緩衝區發送並將其綁定到着色器中,然後將原始網格變形爲關鍵幀。 – zero298

+0

我正在發送一個全新的緩衝區,我不認爲我的書已經超過了其他的東西,在所有書籍的例子中,頂點在整個程序中保持不變。 – Popgalop

+0

在GPU上更新頂點數據有更好的方法。它們被稱爲頂點着色器,如果您可以通過某些靜態輸入數據以編程方式計算每個頂點的位置,那麼這總會贏得性能。希望你的書不是很古老,它不包含頂點着色器;幾乎在同一時間,VBOs和頂點程序被引入OpenGL,但GLSL和頂點着色器幾年後才被引入。我懷疑很多書籍都涵蓋了頂點程序,因爲它們是一種快速被GLSL取代的彙編語言。 –

回答

3

好,glBufferData (...)確實比你想象的。它確實將數據提供給VBO,但更重要的一點是,它在服務器端(用於所有意圖和目的的GPU)爲頂點存儲分配內存。

在您的示例中,刷新數據時,頂點的數量以及存儲它們所需的大小看起來沒有變化。你實際上應該做的是調用glBufferSubData (...)更新數據而不重新分配空間。再加上一個正確的用法標誌(例如GL_DYNAMIC_DRAW),每次繪製東西時,這比從客戶端複製到服務器更有效率。

glBufferData (...)想象爲malloc (...)memcpy (...)的組合。另一方面,glBufferSubData (...)memcpy (...)。爲此,您甚至可以將VBO內存映射到應用程序的地址空間,而無需在客戶端和服務器上分配存儲,使用glMapBuffer (...)glUnmapBuffer (...),這與mmap (...)munmap (...)類似。

2

你應該儘量避免修改你的頂點數據每隔幾幀。頂點/片段着色器專門用於允許您即時修改幾何圖形,當然還有一些限制。然而,在最簡單的情況下(如果你不關心最大化你的性能),完全有可能在每一幀重寫緩衝區,並且它應該仍然擊敗每個對象的調用glBegin .. glEnd