2014-09-27 44 views
1

如果我有一個模型,這是頂點不斷變化,因此我需要重新綁定我的VBO每一幀上的所有信息會是更好的性能,使用即時模式?或者是所有的數據都被立即傳遞給GFX卡,這仍然是VBO的一個補償因素?VBO VS立即模式性能

根據回答第一個問題,這是否意味着保持世界矩陣每個網格比簡單地翻譯的幾何形狀和重建的VBO更好?

回答

4

與幾乎所有性能問題一樣,答案是:這取決於。許多因素起作用,主要是您的確切使用模式以及OpenGL實現的特性。

雖然直接模式在很大程度上認爲是過時的,和現代的OpenGL版本已被刪除,它可以是相當困難與駐國際中心組織,以獲得更好的性能,如果您的幾何是高度動態的。

作爲一個案例研究,我一直工作在一個業餘項目(1)在相當長的時間(和很長的休息時間)。在這種情況下,所有頂點座標都是動態計算的,並且只用於渲染一次。最初的版本是使用即時模式,因爲這種情況很方便,而且立即模式在我編寫時並沒有過時。一旦我在幾年後再次選擇它,並將其移植到Core Profile和ES 3.0,我最初很難獲得相同的性能。

您必須嘗試各種選項才能找到最適合您的用例和平臺的選項。常見選項包括:

  • 將您的頂點數據寫入本地一塊內存,並批量使用glBufferSubData()將其送入VBO。
  • 通過用NULL數據指針調用glBufferData()來創建一個足夠大的VBO來保存數據。然後使用glMapBuffer()glMapBufferRange()映射緩衝區內存,並將頂點數據寫入映射的內存。
  • 對於前面的方法,您可能還想嘗試使用多個緩衝區,並在其中循環,以減少CPU與GPU之間的同步。

關於即時模式在當前GPU上的工作原理有一個常見的誤解(部分反映在其他答案中)。沒有當前的GPU(我知道)實際上支持即時模式。在進行即時模式調用時,驅動程序通常會將頂點數據放入緩衝區,稍後將這些緩衝區提交給GPU。所以GPU最終會執行幾乎相同的繪圖。唯一的區別是如果您構建緩衝區(通過使用基於VBO的繪圖),或者如果您讓驅動程序處理它(通過使用即時模式)。

即時模式繪製通常效率低下的主要原因是它需要這麼多的API調用,而不是因爲GPU最終執行的是什麼。

(1)無恥插頭,如果有人想看看它是什麼:http://retokoradi.com/volume-rendering/

+0

[OpenGL維基上流緩衝對象有一個很好的文章](http://www.opengl.org/wiki/Buffer_Object_Streaming) – 2014-09-27 19:49:17

+0

感謝您的深入解答!特別是關於API調用的部分,我老實說認爲效率低下是在即時模式下使用的方法。有用的信息! – Daniel 2014-09-27 21:15:53

1

是的,使用矩陣來轉換幾何圖形幾乎總是最好的。頂點着色器將每個頂點乘以一個世界矩陣。它全部都在多線程的GPU上,即使在複雜的幾何圖形上也具有良好的性能。

1

VBO的性能會更好,因爲正如你所說,它將所有數據一次發送到GPU。如果您使用雙緩衝解決方案,在準備下一幀的VBO時GPU運行速度通常會更快,而GPU正在從前一幀渲染該幀,因爲它不會停止等待來自CPU的更多數據。

是的,這將是更好的選擇存儲在不同的世界矩陣的每個VBO如果您的轉化可以通過這樣一個矩陣來充分描述。您將每幀更改較少的數據,導致更少的數據必須通過總線傳輸到GPU。