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開啟或者關閉的狀態(glenablevertexattribarray
和gldisablevertexattribarray
)
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 可以看到事實上整個立...