2016-06-23 72 views
4

我需要幫助來查看它們之間的權衡。OpenGL - glDrawElements vs頂點數組對象

  • 在我看來,glDrawElements()需要獲取索引數據「live」作爲參數。
  • 另一方面,如果我使用VAO,那麼在啓動過程中我緩衝數據,驅動程序可能決定將它放在GPU上,然後在渲染期間我只有綁定 VAO並呼叫glDrawArrays()

有沒有辦法將優勢結合起來?我們是否也可以緩衝索引數據?

那麼在頂點着色器中該怎麼看呢?它可以使用索引並在頂點位置數組中查找它嗎?

回答

4

這個信息確實有點難找,但也可以使用glDrawElements與VAO結合使用。然後索引數據可以(但不一定)由ELEMENT_ARRAY_BUFFER提供。像往常一樣,索引工作不需要在頂點着色器中做任何特殊的工作。 OpenGL確保在原始裝配期間索引以正確的方式使用。

spec狀態按此在節10.3.10:

DrawElements,DrawRangeElements和DrawElementsInstanced源 從緩衝器對象,其名稱被綁定到ELEMENT_- ARRAY_BUFFER,使用它們的索引參數作爲其索引的偏移到緩衝對象

這基本上意味着,每當一個ELEMENT_ARRAY_BUFFER綁定,指數參數被用作偏移量,此緩衝區(0表示從初學者開始荷蘭國際集團)。當沒有綁定這樣的緩衝區時,索引指針指定索引數組的地址。

+2

由於問題是關於VAO的,所以還值得一提的是'GL_ELEMENT_ARRAY_BUFFER'綁定是VAO狀態的一部分。因此,您可以在VAO設置期間綁定一次緩衝區,並且不必在每次繪製調用之前再次將其綁定。那麼這將發生作爲綁定VAO的一部分。 –