OpenGL頂點緩沖區對象


OpenGL頂點緩沖區對象

  顯示列表可以快速簡單地優化立即模式(glBegin/glEnd)的代碼。在最壞的情況下,顯示列表的命令被預編譯存到命令緩沖區中,然后發送給圖形硬件。在最好的情況下,是編譯后放在圖形硬件中以減少傳輸的帶寬。顯示列表的優化根據實現的不同而有所不同,而且顯示列表一旦被創建就不可以修改,靈活性差。

  頂點數組提供了我們想要的靈活性,最壞的結果不過是把數據塊復制給硬件而已(比立即模式快的多)。而索引頂點數組可以減少向硬件傳輸的頂點數據的數量,減少變換的開銷。

  OpenGL還提供了一個特性對圖形的吞吐量進行終極的控制。當我們使用頂點數組時,可以把單個數組從客戶內存(CPU可以訪問)傳輸到圖形硬件。這個特性稱為頂點緩沖區對象,允許我們按照類似於管理紋理的方式來管理頂點數組數據,而且頂點緩沖區對象要更靈活。

管理和使用緩沖區對象

  首先要使用緩沖區對象得有頂點數組。第二步創建頂點緩沖區對象,使用函數:

  void glGenBuffers(GLsizei n, GLuint *buffers);

  這個函數工作方式像glGenTextures一樣。其對應的刪除緩沖區對象的函數是glDeleteBuffers。

  然后綁定頂點緩沖區對象:

  void glBindBuffer(GLenum target, GLuint buffer);

  這里的target參數指定了要綁定什么樣的數組。類型有很多,可以是頂點數組GL_ARRAY_BUFFER,頂點索引數組GL_ELEMENT_ARRAY_BUFFER(用於glDrawElements和其他基於索引的渲染函數)等。

加載緩沖區對象

  在綁定了緩沖區對象之后,我們就可以往圖形硬件拷貝頂點數組了。

  void glBufferData(GLenum target, GLsizeptr size, GLvoid *data, GLenum usage);

  target可以是GL_ARRAY_BUFFER或者GL_ELEMENT_ARRAY_BUFFER等。size指定了頂點數組的大小(以字節為單位)。最后一個參數是用法提示。如下表:

用法提示 描述
GL_DYNAMIC_DRAW 存儲在緩沖區對象中的頂點數組經常要更新,並且可能多次作為繪圖的來源。這個提示告訴OpenGL實現把數據放置在更新開銷不大的地方。
GL_STATIC_DRAW 數組很少更新,但可能多次作為繪圖的來源。這個提示告訴OpenGL實現把數據放置在能夠快速渲染但不需要快速更新的地方。
GL_STREAM_DRAW 數據極少變化,並且最多只有幾次作為繪圖的源數據。這個提示告訴OpenGL實現有一些時間敏感的數據(例如動畫)將只使用一次,然后被替換。

  

從頂點緩沖區對象渲染

從頂點緩沖區對象渲染有兩個地方需要改動。首先,需要在調用glVertexPointer之前綁定緩沖區對象,然后把真實的數組指針改成頂點緩沖區對象的偏移值。例如:

glVertexPointer(3, GL_FLOAT, 0, pVerts);

現在變成了:

glBindBuffer(GL_ARRAY_BUFFER, bufferObjects[0]);

glVertexPointer(3, GL_FLOAT, 0, 0);

渲染 就變成了:

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bufferObjects[3]);

glDrawElements(GL_TRIANGLES, nNumIdexes, GL_UNSIGNED_SHORT, 0);

最后一個參數會偏移量。從技術上說,緩沖區對象的這個偏移量基於本地體系結構的NULL指針。在大多數系統中,可設置為0.

參考:http://my.oschina.net/sweetdark/blog/186675


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM