ebo(element buffer object,也叫ibo:index buffer object)索引緩衝區物件,這個緩衝區主要用來儲存頂點的索引資訊。
考慮這樣一種情況,我們需要繪製乙個立方體
在指定頂點座標的時候,可以使用以下的乙個陣列:
glfloat vertices = ;
可以看到事實上整個立方體只有8個頂點,我們儲存頂點座標的陣列裡出現了大量重複的頂點。最好的方式應該是每個頂點只需要儲存一次,當我們需要這些頂點時,只需要呼叫頂點的索引來引用的需要的頂點資料
ebo就是用來儲存這些索引資料的地方。
1. 建立ebo
建立ebo的方式與建立vbo類似,都是使用glgenbuffers
void glgenbuffers( glsizei n,
gluint * buffers);
//n :建立緩衝區數量
//buffers:存放這些id的陣列或者變數指標
gluint eboid;
glgenbuffers(1, &eboid);
2.傳入資料
在建立完成ebo之後,需要向ebo中傳入索引資料,在傳入之前需要繫結將ebo(將eboid設定為當前操作的ebo)
glbindbuffer(gl_element_array_buffer, ebo); //繫結ebo
glbufferdata(gl_element_array_buffer, sizeof(indices), indices, gl_static_draw); //傳入索引資料到ebo中
3. 繪製幾何體
當設定完成之後,可以呼叫gldrawelements
來繪製(如果不使用索引的方式,繪製需要呼叫的函式是gldrawarrays
)
void gldrawelements(
glenum mode, //繪製模式,可以是gl_********s、gl_points等
glsizei count, //繪製頂點的次數
glenum type, //索引資料的型別
const glvoid * indices //ebo中的偏移量(如果不使用ebo,那麼indices指向的是索引陣列的指標)
);
示例程式示例程式中使用ebo的方式繪製乙個四邊形
#pragma comment(lib, "glew32.lib")
#pragma comment(lib, "freeglut.lib")
#include
#include
#include
gluint eboid;
#define use_ebo
glfloat vertices = ;
gluint indices = ;
void changesize(int w, int h)
void setuprc()
void renderscene(void)
int main(int argc, char* argv)
setuprc();
glutmainloop();
return
0;}
為了簡單,沒有使用core profile的方式來使用ebo,**中如果定義use_ebo,gldrawelements
最後乙個引數是ebo中的偏移量,否則就是索引陣列的指標。 OpenGL緩衝區物件
opengl 緩衝區物件 今天學習了一下緩衝區物件.opengl是按照客戶機 伺服器模式設計的,在opengl需要資料的時候,都必須把資料從客戶機內傳輸到伺服器。緩衝區物件,允許應用程式現實的指定把哪些資料儲存在圖形伺服器。1.建立緩衝區物件 glgenbuffers opengl分配n個當前未使用...
OpenGL緩衝區物件之FBO
在opengl渲染管線中幾何資料和紋理經過變換和一些測試處理,最終會被展示到螢幕上。opengl渲染管線的最終位置是在幀緩衝區中。幀緩衝區是一系列二維的畫素儲存陣列,包括了顏色緩衝區 深度緩衝區 模板緩衝區以及累積緩衝區。預設情況下opengl使用的是視窗系統提供的幀緩衝區。opengl的gl ar...
OpenGL緩衝區物件之VAO
vao vertex array object 是opengl用來處理頂點資料的乙個緩衝區物件,它不能單獨使用,都是結合vbo來一起使用的。vao是opengl coreprofile 引入的乙個特性。事實上在coreprofile中做頂點資料傳入時,必須使用vao方式。當我們使用vbo傳入頂點資料...