1. 程式人生 > >OpenGL超級寶典第七版學習筆記-緩衝區(buffers)(1)

OpenGL超級寶典第七版學習筆記-緩衝區(buffers)(1)

此係列學習筆記來自OpenGL超級寶典第七版英文版自己翻譯而來,此書使用的OpenGL核心的版本是4.5.

2017-3-22緩衝區(buffers)

1、  緩衝區是線性分配儲存的。

2、  緩衝區是由名字表示的,OpenGL本質上是使用名字來辨識緩衝區的。

3、  在你使用一個緩衝區前,你需要向OpenGL請求一些名字,然後使用這些名字來申請記憶體,最後向記憶體中儲存資料。這些記憶體稱之為緩衝區的資料倉庫。

4、  一旦你獲得了一個緩衝區的名字,就可以通過繫結點把緩衝區附著到OpenGL上下文中去。繫結點(binding points)一般也可以指目標(targets),這些屬於一般可以替換使用(雖然從技術上講把繫結點與目標看成一個東西是不正確的,因為一個單獨的目標可能會有很多繫結點。但在大多數場合,混淆使用這兩者應該會被正確的理解)

5、  OpenGL中有很多繫結點,他們各有不同的用處。

6、  OpenGL中的的大多數物件(Object)都是用GLuint型別的變數代表的,這個變數即稱之為名字。

7、  建立緩衝區物件:

void glCreateBuffers(GLsizei n , GLuint * buffers);

第一個引數表示要建立的緩衝區物件的數量,第二個引數表示要建立的緩衝區物件的名字的地址,如果要建立大於1個(n),那麼引數buffers應該是一個至少有n個元素的GLuint陣列的首地址。OpenGL預設相信這個陣列的元素數是大於你要建立的緩衝區物件的數目的。

8、 把緩衝區物件繫結到OpenGL上下文中去:

void glBindBuffers(GLenum target, GLuint buffer);

9、  為緩衝區物件分配記憶體:

void glBufferStorage(GLenum target ,GLsizeiptrsize,const void* data,GLbitfieldflags);

void glNamedBufferStorage(GLuintbuffer ,GLsizeiptrsize,const void* data,GLbitfieldflags);

第一個函式將為所有的繫結到target指定的繫結點的緩衝區物件分配記憶體,第二個則只為buffer這一個緩衝區物件分配記憶體。

size表示要分配的記憶體的大小,單位為位元組,data則是要用來初始化記憶體內容的資料的地址,為Null則不初始化,flags則指定了如何使用這個緩衝區物件。

一旦緩衝區物件的儲存已經使用上面的函式分配了,那麼他的儲存(地址)、儲存記憶體大小和使用目的flag將不能重新分配或指定,但是資料倉庫內的內容是可以改變的。

10、為緩衝區分配物件函式中的引數flag可能的值有:

         GL_DYNAMIC_STORAGE_BIT,告訴OpenGL緩衝區的內容是可以改變的,如果不指定這個位,那麼OpenGL將會給這個緩衝區物件分配一些不容易被更改的記憶體上去,而且glBufferSubData()這個函式將不能改變這個緩衝區物件的值(有其他的OpenGL函式可以);

         GL_MAP_READ_BIT,GL_MAP_WRITE_BIT,GL_MAP_PERSISTENT_BIT,GL_MAT_COHERENT_BIT這幾個flag標誌位,告訴OpenGL是否以及怎樣去對映資料倉庫。對映操作(mapping)是指從主程式中獲得一個的一個指標,而這個指標代表某一個緩衝區的潛在的資料倉庫。前兩個顧名思意,不在詳述,第三個告訴系統當你在使用其他繪製指令時,你希望對映某緩衝區後保持其對映狀態。否則意味著當你因為呼叫繪製指令時而使用某緩衝區時,系統不要求對映這個緩衝區。支援永久對映會造成大量的額外開銷,除非你必須使用它,否則儘量不要使用它。最後一個標誌位告訴系統你想要能夠與GPU緊湊的共享資料。如果不設定此位,你需要告訴系統什麼時候往該緩衝區寫入資料,即使你不解除對映它。