我剛剛開始學習C++中的頂點緩衝區對象。我正在讀一本關於openGL的書,其中說vbo渲染比其他形式的渲染更有效,因爲數據存儲在gpu而不是堆上,但是我很困惑,如果你仍然需要加載從堆到gpu的數據陣列。每隔幾秒鐘,我更新我的程序的頂點數據,這意味着我必須使用glBufferData刷新數據以更新到新狀態。我沒有看到這比僅僅正常渲染數組更有效。我想知道是否我要調用glBufferData,或者如果有更好的方法直接在GPU上更新頂點數據。何時使用glBufferData打開gl
2
A
回答
3
好,glBufferData (...)
確實比你想象的。它確實將數據提供給VBO,但更重要的一點是,它在服務器端(用於所有意圖和目的的GPU)爲頂點存儲分配內存。
在您的示例中,刷新數據時,頂點的數量以及存儲它們所需的大小看起來沒有變化。你實際上應該做的是調用glBufferSubData (...)
更新數據而不重新分配空間。再加上一個正確的用法標誌(例如GL_DYNAMIC_DRAW
),每次繪製東西時,這比從客戶端複製到服務器更有效率。
將glBufferData (...)
想象爲malloc (...)
和memcpy (...)
的組合。另一方面,glBufferSubData (...)
是memcpy (...)
。爲此,您甚至可以將VBO內存映射到應用程序的地址空間,而無需在客戶端和服務器上分配存儲,使用glMapBuffer (...)
和glUnmapBuffer (...)
,這與mmap (...)
和munmap (...)
類似。
2
你應該儘量避免修改你的頂點數據每隔幾幀。頂點/片段着色器專門用於允許您即時修改幾何圖形,當然還有一些限制。然而,在最簡單的情況下(如果你不關心最大化你的性能),完全有可能在每一幀重寫緩衝區,並且它應該仍然擊敗每個對象的調用glBegin
.. glEnd
。
相關問題
- 1. Android線程和打開GL
- 2. 如何使用打開的gl查找長方體中的點
- 3. 在Android上打開GL ES:如何使用gluUnProject?
- 4. 在iPhone中使用打開的gl寫文本
- 5. 打開GL錯誤:使用未聲明的標識符'gl_FragColor'
- 6. 無法打開源文件「GL/glew.h」
- 7. 如何在PyOpenGL中使用glBufferData()?
- 8. 使用時打開
- 9. iPhone:Open-gl開頭..?
- 10. 編譯C++項目時出現紋理錯誤/打開GL
- 11. 在打開的gl中繪製燈光時的凹凸燈
- 12. 在Galaxy S2上渲染時打開GL口吃
- 13. glBufferData&glBufferDataARB
- 14. 如何繪製彎曲的圓柱體c#打開gl
- 15. 在ubuntu guest虛擬框中打開GL調用流程
- 16. GL_INVALID_OPERATION在glBufferData()kotlin
- 17. glBufferData和glBufferSubData Offset
- 18. glDeleteBuffers比glBufferData慢
- 19. 使用iText打開PDF時自動打開打印對話框
- 20. 定時打開文件時使用PowerShell
- 21. VBO + glBufferData當尺寸太高時崩潰
- 22. 開放GL選擇紋理
- 23. 開放GL照明問題
- 24. 使用打開()
- 25. 與glBufferData段錯誤()
- 26. 何時使用Java servlets打開和何時關閉mysql連接?
- 27. 使用python打開url打開時間的麻煩
- 28. iOS:當使用「打開」時,大文件不會立即打開
- 29. 如何在打印PDF時不使用Bluebeam打開revu PDF的
- 30. 如何使用角度打開頁面時展開摺疊?
您是通過全新的緩衝區發送還是隻發生了什麼變化?另外,你爲什麼要發送一個新的緩衝區?如果是動畫,請考慮將動畫的「關鍵幀」作爲多個緩衝區發送並將其綁定到着色器中,然後將原始網格變形爲關鍵幀。 – zero298
我正在發送一個全新的緩衝區,我不認爲我的書已經超過了其他的東西,在所有書籍的例子中,頂點在整個程序中保持不變。 – Popgalop
在GPU上更新頂點數據有更好的方法。它們被稱爲頂點着色器,如果您可以通過某些靜態輸入數據以編程方式計算每個頂點的位置,那麼這總會贏得性能。希望你的書不是很古老,它不包含頂點着色器;幾乎在同一時間,VBOs和頂點程序被引入OpenGL,但GLSL和頂點着色器幾年後才被引入。我懷疑很多書籍都涵蓋了頂點程序,因爲它們是一種快速被GLSL取代的彙編語言。 –