OpenGL緩衝區物件之EBO

2021-07-25 05:27:21 字數 2021 閱讀 7251



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傳入頂點資料...