簡體   English   中英

在OpenGL中管理大量行的最有效方法是什么?

[英]What is the most efficient way to manage a large set of lines in OpenGL?

我正在開發一個簡單的CAD程序,它使用OpenGL來處理屏幕渲染。 屏幕上繪制的每個形狀完全由簡單的線段構成,因此即使是簡單的繪圖也最終會處理數千條單獨的線條。

在我的應用程序和OpenGL之間傳遞此行集合中的更改的最佳方法是什么? 有沒有辦法只更新OpenGL緩沖區中某些行的子集?

我在這里尋找一個概念性的答案。 無需深入了解實際的源代碼,只需要了解有關數據結構和通信的一些建議。

您可以使用一種簡單的方法,例如使用顯示列表(glNewList / glEndList)

另一個稍微復雜的選項是使用頂點緩沖對象(VBO - GL_ARB_vertex_buffer_object)。 它們的優點是可以動態更改它們,而顯示列表則不能。

這些基本上批量處理所有數據/轉換並在GPU上執行(假設您正在使用硬件加速),從而提高性能。

頂點緩沖區對象可能就是您想要的。 加載原始數據集后,可以使用glBufferSubData()對現有塊進行修改。

如果你添加額外的線段並溢出緩沖區的大小,你當然必須創建一個新的緩沖區,但這與在某些東西增長時必須在C中分配一個新的,更大的內存塊沒什么不同。

編輯:顯示列表上的幾個注釋,以及為什么不使用它們:

  1. 在OpenGL 3.0中,不推薦使用顯示列表,因此使用它們不能在3.0之前向前兼容(當然,2.1實現將會存​​在一段時間,因此根據您的目標受眾,這可能不是問題)
  2. 無論何時更改任何內容,都必須重建整個顯示列表,如果事情經常更改,則會使顯示列表的整個目的失效。

不確定你是否已經這樣做了,但是值得一提的是,如果可能的話,你應該嘗試使用GL_LINE_STRIP而不是單獨的GL_LINES來減少發送到卡的頂點數據量。

我的建議是嘗試使用場景圖,線/曲線的某種分層數據結構。 如果您有大型模型,如果您有簡單的行列表,性能將受到影響。 使用圖形/樹結構,您可以輕松檢查哪些項目可見,哪些項目不使用邊界卷。 使用場景圖,您可以輕松應用轉換並重用幾何圖形。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM