OpenGL緩衝區物件之VAO

2021-07-24 16:39:25 字數 4226 閱讀 8676

vao ( vertex array object )是opengl用來處理頂點資料的乙個緩衝區物件,它不能單獨使用,都是結合vbo來一起使用的。vao是opengl coreprofile 引入的乙個特性。事實上在coreprofile中做頂點資料傳入時,必須使用vao方式。

當我們使用vbo傳入頂點資料時,一般的處理如下:

// 繫結vbo,設定vbo中的資料

glbindbuffer(gl_array_buffer, vbo);

glbufferdata(gl_array_buffer, sizeof(vertices), vertices, gl_static_draw);

// 1. 設定頂點屬性

glvertexattribpointer(0, 3, gl_float, gl_false, 3 * sizeof(glfloat), (glvoid*)0);

glenablevertexattribarray(0);

// 2. 使用shader程式

gluseprogram(shaderprogram);

// 3. 繪製

someopenglfunctionthatdrawsour********();

每當我們繪製乙個幾何體時,我們需要重複同樣的工作(首先繫結緩衝區、然後設定頂點屬性)。當需要繪製的物體很多時,這個過程就顯得有些耗時。那麼我們有沒有一種方式來簡化這一過程呢?這就是vao做的事情,它將所有頂點繪製過程中的這些設定和繫結過程集中儲存在一起,當我們需要時,只需要使用相應的vao即可。

vao的這種方式有點像乙個中介,把所有繁瑣的繫結和頂點設定工作都集中起來處理,我們需要繪製時,直接找這個中介就好了。

vao物件中儲存的內容包括:

1. vao開啟或者關閉的狀態(glenablevertexattribarraygldisablevertexattribarray)

2. 使用glvertexattribpointer對頂點屬性進行的設定

3. 儲存頂點資料的vbo物件

1.建立vao

建立vao使用glgenvertexarrays引數與建立其他緩衝區物件的glgenbuffers類似

void glgenvertexarrays( glsizei n,

gluint *arrays);

2.繫結並設定vao

在建立vao之後,需要使用glbindvertexarray設定它為當前操作的vao,之後我們所有關於頂點資料的設定(包括資料使用的vbo物件,頂點的屬性設定的資訊都會被儲存在vao之中),在設定完成之後一般會解綁vao,然後在需要繪製的時候啟用相應的vao物件。具體的**如下所示:

//建立vao

gluint vao;

glgenvertexarrays(1, &vao);

//設定當前vao,之後所有操作(注意:這些操作必須是上文vao中包含的內容所註明的呼叫,其他非vao中儲存的內容即使呼叫了也不會影響vao)儲存在該vao中

glbindvertexarray(vao);

glbindbuffer(gl_array_buffer, vbo); //設定了vbo

glbufferdata(gl_array_buffer, sizeof(vertices), vertices, gl_static_draw);//設定vbo中的資料

glvertexattribpointer(0, 3, gl_float, gl_false, 3 * sizeof(glfloat), (glvoid*)0); //設定頂點屬性(索引為0的屬性,與shader中的內容有互動)

glenablevertexattribarray(0); //設定開啟頂點屬性(索引為0的屬性,與shader中的內容有互動)

glbindvertexarray(0); //解綁vao(解綁主要是為了不影響後續vao的設定,有點類似於c++中指標delete後置空,是個好習慣)

通過上面的**就完成了對vao的設定,當我們需要繪製的時候,使用的**類似於:

gluseprogram(shaderprogram);

glbindvertexarray(vao); //繫結我們需要的vao,會導致上面所有vao儲存的設定自動設定完成

someopenglfunctionthatdrawsour********();

glbindvertexarray(0); //解綁vao

另外需要注意的是,當我們使用ebo的時候,vao中也會記錄索引資訊,因此完整的vao所包含的內容圖如下所示(新增了ebo):

OpenGL緩衝區物件

opengl 緩衝區物件 今天學習了一下緩衝區物件.opengl是按照客戶機 伺服器模式設計的,在opengl需要資料的時候,都必須把資料從客戶機內傳輸到伺服器。緩衝區物件,允許應用程式現實的指定把哪些資料儲存在圖形伺服器。1.建立緩衝區物件 glgenbuffers opengl分配n個當前未使用...

OpenGL緩衝區物件之FBO

在opengl渲染管線中幾何資料和紋理經過變換和一些測試處理,最終會被展示到螢幕上。opengl渲染管線的最終位置是在幀緩衝區中。幀緩衝區是一系列二維的畫素儲存陣列,包括了顏色緩衝區 深度緩衝區 模板緩衝區以及累積緩衝區。預設情況下opengl使用的是視窗系統提供的幀緩衝區。opengl的gl ar...

OpenGL緩衝區物件之EBO

ebo element buffer object,也叫ibo index buffer object 索引緩衝區物件,這個緩衝區主要用來儲存頂點的索引資訊。考慮這樣一種情況,我們需要繪製乙個立方體 在指定頂點座標的時候,可以使用以下的乙個陣列 glfloat vertices 可以看到事實上整個立...