OpenGL頂點緩衝區對象

OpenGL頂點緩衝區對象html

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

  頂點數組提供了咱們想要的靈活性,最壞的結果不過是把數據塊複製給硬件而已(比當即模式快的多)。而索引頂點數組能夠減小向硬件傳輸的頂點數據的數量,減小變換的開銷。函數

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

管理和使用緩衝區對象

  首先要使用緩衝區對象得有頂點數組。第二步建立頂點緩衝區對象,使用函數:動畫

  void glGenBuffers(GLsizei n, GLuint *buffers);ui

  這個函數工做方式像glGenTextures同樣。其對應的刪除緩衝區對象的函數是glDeleteBuffers。spa

  而後綁定頂點緩衝區對象:.net

  void glBindBuffer(GLenum target, GLuint buffer);指針

  這裏的target參數指定了要綁定什麼樣的數組。類型有不少,能夠是頂點數組GL_ARRAY_BUFFER,頂點索引數組GL_ELEMENT_ARRAY_BUFFER(用於glDrawElements和其餘基於索引的渲染函數)等。xml

加載緩衝區對象

  在綁定了緩衝區對象以後,咱們就能夠往圖形硬件拷貝頂點數組了。

  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

相關文章
相關標籤/搜索