我正在開發一個簡單的使用OpenGL處理屏幕渲染的CAD程序。在屏幕上繪製的每個形狀都完全由簡單的線段構成,因此即使是簡單的繪圖也會處理數千個單獨的線條。在OpenGL中管理大量行的最有效方法是什麼?
什麼是溝通這個集合我的應用程序和OpenGL之間的線在變化的最佳方式是什麼?有沒有辦法只更新OpenGL緩衝區中某一行的子集?
我在這裏尋找一個概念性的答案。無需進入實際的源代碼,只需要對數據結構和通信提出一些建議。
我正在開發一個簡單的使用OpenGL處理屏幕渲染的CAD程序。在屏幕上繪製的每個形狀都完全由簡單的線段構成,因此即使是簡單的繪圖也會處理數千個單獨的線條。在OpenGL中管理大量行的最有效方法是什麼?
什麼是溝通這個集合我的應用程序和OpenGL之間的線在變化的最佳方式是什麼?有沒有辦法只更新OpenGL緩衝區中某一行的子集?
我在這裏尋找一個概念性的答案。無需進入實際的源代碼,只需要對數據結構和通信提出一些建議。
可以使用一種簡單的方法,例如使用顯示錶(glNewList後/ glEndList)
另一種選擇,這是稍微複雜一些,是使用頂點緩存對象(維也納組織 - GL_ARB_vertex_buffer_object)。它們的優點是可以動態更改,而顯示列表則不能。
這些基本批次所有數據/變換起來,他們在GPU上執行(假設你使用硬件加速),從而獲得更高的性能。
頂點緩衝區對象可能是你想要的。一旦加載了原始數據集,您可以使用glBufferSubData()
對現有數據塊進行修改。
如果添加額外的行段並溢出緩衝區的大小,當然必須創建一個新的緩衝區,但這與在C中分配新的,更大的內存塊時沒有什麼不同, 。
編輯:在顯示列表有兩點要注意,爲什麼不使用它們:
不知道你是否已經這樣做了,但值得一提的是,如果可能的話,你應該嘗試使用GL_LINE_STRIP而不是單獨的GL_LINES來減少發送到卡上的頂點數據量。
我的建議是使用一個場景圖,某種層次的數據結構爲線/曲線嘗試。如果您擁有巨大的型號,如果您擁有簡單的線條列表,性能將受到影響。通過圖形/樹結構,您可以輕鬆檢查哪些項目可見,哪些不通過使用邊界卷。另外,通過場景圖,您可以輕鬆應用轉換並重新使用幾何圖形。
謝謝你的提示! – 2008-12-02 00:10:17