在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...