簡體   English   中英

OpenGL-帶glDrawElements的索引繪制

[英]OpenGL - Indexed Draws with glDrawElements

關於OpenGL如何處理這些繪制操作,我有幾個問題。

  1. 因此,可以說我將OpenGL指針傳遞給了我的頂點數組。 然后,我可以使用索引數組調用glDrawElements。 它將使用頂點數組中的那些索引正確繪制所請求的形狀嗎?

  2. 調用glDrawElements之后,我可以再使用另一組索引執行另一個glDawElements調用嗎? 然后,它將使用原始頂點數組繪制新的索引數組嗎?

  3. 重做所有這些調用時,OpenGL是否在下一幀保留頂點數據? 因此,下一個頂點指針調用會快很多嗎?

  4. 假設最后三個問題的答案是肯定的,如果我想在每幀多個頂點陣列上執行此操作怎么辦? 我假設對超過1個頂點數組執行此操作將導致OpenGL從圖形內存中刪除最后使用的數組,並開始使用新的數組。 但是在我的情況下,頂點數組永遠不會改變。 所以我想知道的是,opengl是否在下次發送頂點數據時將頂點數組保持在萬一情況下? 如果沒有,我可以優化它以允許這樣的事情嗎? 基本上,我想使用索引在頂點之間進行程序繪制而不更新頂點數據,以減少開銷並加快復雜的渲染,而渲染需要不斷進行程序更改,這些形狀將始終使用原始頂點數組中的頂點。 這可能還是我只是幻想?

  5. 如果我只是幻想着我的第四個問題,那么每幀繪制很多多邊形的快速方法有哪些? 我是否必須始終傳遞一組全新的頂點數據才能進行很小的更改? 當頂點數據不變時,它是否已經執行了此操作,因為我注意到我無法真正繞過頂點指針調用每一幀。

  6. 隨意完全抨擊我在斷言中犯的任何邏輯錯誤。 我正在嘗試學習有關opengl如何工作的一切知識,而我目前對它如何工作的假設完全有可能是錯誤的。

1.所以可以說我將OpenGL指針傳遞給了我的頂點數組。 然后,我可以使用索引數組調用glDrawElements。 它將使用頂點數組中的那些索引正確繪制所請求的形狀嗎?

是。

2.在那次glDrawElements調用之后,我可以再對另一組索引執行另一個glDawElements調用嗎? 然后,它將使用原始頂點數組繪制新的索引數組嗎?

是。

3.重做所有這些調用時,OpenGL是否在下一幀保留頂點數據? 因此,下一個頂點指針調用會快很多嗎?

回答這個問題比您可能要棘手得多。 您問這些問題的方式使我假設您使用客戶端頂點數組 ,即您的系統內存中有一些數組,並且讓頂點指針直接指向這些頂點數組 在這種情況下,答案是no GL無法以任何有用的方式“緩存”該數據。 繪制調用完成后,必須假定您可能會更改數據,並且必須比較每一位以確保您沒有更改任何內容。

但是,客戶端VA並不是將VA包含在GL中的唯一方法-實際上,它們已經完全過時,自GL3.0起已棄用,並已從現代OpenGL版本中刪除 進行精簡的現代方法是使用頂點緩沖區對象 ,該對象基本上是由GL管理但由用戶操縱的緩沖區。 緩沖區對象只是一塊內存,但是您將需要特殊的GL調用來創建它們,讀取或寫入或更改數據等等。 緩沖區對象很可能不會存儲在系統內存中,而是直接存儲在VRAM中,這對於反復使用的靜態數據非常有用。 看看GL_ARB_vertex_buffer_object擴展規范 ,該規范最初於2003年引入該功能,並成為GL 1.5中的核心。

4.假設最后三個問題的答案是肯定的,如果我想在每幀多個頂點數組上執行此操作怎么辦? 我假設對超過1個頂點數組執行此操作將導致OpenGL從圖形內存中刪除最后使用的數組,並開始使用新的數組。 但是在我的情況下,頂點數組永遠不會改變。 所以我想知道的是,opengl是否在下次發送頂點數據時將頂點數組保持在萬一情況下? 如果沒有,我可以優化它以允許這樣的事情嗎? 基本上,我想使用索引在頂點之間進行程序繪制而不更新頂點數據,以減少開銷並加快復雜的渲染,而渲染需要不斷進行程序更改,這些形狀將始終使用原始頂點數組中的頂點。 這可能還是我只是幻想?

VBO正是您在這里尋找的東西。

5,如果我只是幻想我的第四個問題,那么每幀繪制很多多邊形的快速方法有哪些? 我是否必須始終傳遞一組全新的頂點數據才能進行很小的更改? 當頂點數據不變時,它是否已經執行了此操作,因為我注意到我無法真正繞過頂點指針調用每一幀。

您也可以僅更新VBO的一部分。 但是,如果您有許多隨機分布在緩沖區中的小部分,可能會變得效率低下,更新連續(子)區域會更有效。 但這只是一個話題。

  1. 否。創建頂點緩沖對象(VBO)后,它將立即保留在GPU內存中。 否則,矢量數據需要重新傳輸(避免這種情況的一種舊方法是“顯示列表”)。 在這兩種情況下,后續幀的性能應保持相似(但使用VBO方法要好得多):您可以在渲染第一個幀之前進行VBO創建和下載。
  2. 引入VBO就是為了完全為您提供此功能。 只需創建幾個VBO。 當您需要的GPU內存超過可用內存時,事情就會變得混亂。
  3. VBO仍然是答案,請參閱僅修改VBO緩沖區數據的特定元素類型?

聽起來您應該嘗試一種稱為“頂點緩沖對象”的方法。 它具有與“頂點陣列”相同的優點,但是您可以創建多個頂點緩沖區並將其存儲在“命名插槽”中。 由於數據直接存儲在圖形卡內存中,因此該方法具有更好的性能。

是一個很好的C ++入門教程。

暫無
暫無

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

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