2008-12-01 47 views
6

我正在開發一個簡單的使用OpenGL處理​​屏幕渲染的CAD程序。在屏幕上繪製的每個形狀都完全由簡單的線段構成,因此即使是簡單的繪圖也會處理數千個單獨的線條。在OpenGL中管理大量行的最有效方法是什麼?

什麼是溝通這個集合我的應用程序和OpenGL之間的線在變化的最佳方式是什麼?有沒有辦法只更新OpenGL緩衝區中某一行的子集?

我在這裏尋找一個概念性的答案。無需進入實際的源代碼,只需要對數據結構和通信提出一些建議。

回答

8

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

另一種選擇,這是稍微複雜一些,是使用頂點緩存對象(維也納組織 - GL_ARB_vertex_buffer_object)。它們的優點是可以動態更改,而顯示列表則不能。

這些基本批次所有數據/變換起來,他們在GPU上執行(假設你使用硬件加速),從而獲得更高的性能。

7

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

如果添加額外的行段並溢出緩衝區的大小,當然必須創建一個新的緩衝區,但這與在C中分配新的,更大的內存塊時沒有什麼不同, 。

編輯:在顯示列表有兩點要注意,爲什麼不使用它們:

  1. 在OpenGL 3.0的,顯示列表被棄用,因此,使用它們不向前兼容過去的3.0(2.1實現將是一段時間了,當然,所以這取決於你的目標受衆,這可能不是一個問題)
  2. 每當你改變什麼,你要重建整個顯示列表,這違背了顯示列表,如果事情的全部目的經常改變。
2

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

+0

謝謝你的提示! – 2008-12-02 00:10:17

2

我的建議是使用一個場景圖,某種層次的數據結構爲線/曲線嘗試。如果您擁有巨大的型號,如果您擁有簡單的線條列表,性能將受到影響。通過圖形/樹結構,您可以輕鬆檢查哪些項目可見,哪些不通過使用邊界卷。另外,通過場景圖,您可以輕鬆應用轉換並重新使用幾何圖形。

相關問題