OpenGL學習筆記(八)

2021-10-06 16:32:22 字數 1914 閱讀 6639

在opengl中繪製乙個物體,**會像是這樣:

// 0. 複製頂點陣列到緩衝中供opengl使用

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

(float),

(void*)

0);glenablevertexattribarray(0

);// 2. 當我們渲染乙個物體時要使用著色器程式

gluseprogram

(shaderprogram)

;// 3. 繪製物體

someopenglfunctionthatdrawsour********()

;

每當我們繪製乙個物體的時候都必須重複這一過程。這看起來可能不多,但是如果有超過5個頂點屬性,上百個不同物體呢(這其實並不罕見)。繫結正確的緩衝物件,為每個物體配置所有頂點屬性很快就變成一件麻煩事。有沒有一些方法可以使我們把所有這些狀態配置儲存在乙個物件中,並且可以通過繫結這個物件來恢復狀態呢?

頂點陣列物件(vertex array object, vao)可以像頂點緩衝物件那樣被繫結,任何隨後的頂點屬性呼叫都會儲存在這個vao中。這樣的好處就是,當配置頂點屬性指標時,你只需要將那些呼叫執行一次,之後再繪製物體的時候只需要繫結相應的vao就行了。這使在不同頂點資料和屬性配置之間切換變得非常簡單,只需要繫結不同的vao就行了。剛剛設定的所有狀態都將儲存在vao中

乙個頂點陣列物件會儲存以下這些內容:

建立乙個vao和建立乙個vbo很類似:

unsigned

int vao;

glgenvertexarrays(1

,&vao)

;

要想使用vao,要做的只是使用glbindvertexarray繫結vao。從繫結之後起,我們應該繫結和配置對應的vbo和屬性指標,之後解綁vao供之後使用。當我們打算繪製乙個物體的時候,我們只要在繪製物體前簡單地把vao繫結到希望使用的設定上就行了。這段**應該看起來像這樣:

// ..:: 初始化**(只執行一次 (除非你的物體頻繁改變)) :: ..

// 1. 繫結vao

glbindvertexarray

(vao)

;// 2. 把頂點陣列複製到緩衝中供opengl使用

glbindbuffer

(gl_array_buffer, vbo)

;glbufferdata

(gl_array_buffer,

sizeof

(vertices)

, vertices, gl_static_draw)

;// 3. 設定頂點屬性指標

glvertexattribpointer(0

,3, gl_float, gl_false,3*

sizeof

(float),

(void*)

0);glenablevertexattribarray(0

);[.

..]// ..:: 繪製**(渲染迴圈中) :: ..

// 4. 繪製物體

gluseprogram

(shaderprogram)

;glbindvertexarray

(vao)

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

;

OPENGL學習筆記之八

2017 11 15 閱讀材料來自learnopengl.com以及learnopengl cn.github.io 我們通常會自己設定乙個座標的範圍,之後再在頂點著色器中將這些座標變換為標準化裝置座標 normalized device coordinate,ndc 然後將這些標準化裝置座標傳入光...

OpenGL學習筆記《八》光照

在理解opengl中的光照之前,先理解一下顏色。在我們現實生活中,我們看到的物體顏色,是物體反射的顏色,即沒有被物體吸收掉的部分。opengl利用這個,在系統中模擬的顏色,就是定義乙個表示物件的顏色向量a,再頂乙個乙個表示光源的顏色向量b,然後在片段著色器中將兩個向量相乘得到表示物體的顏色。因此大致...

OpenGL學習筆記(八)底紋疊加

測試效果如下 原始碼 main.cpp include include include include include include include using namespace std void processinput glfwwindow window void framebuffer s...