現代OpenGL學習筆記(一)入門階段知識點隨記

vao(Vertex Array Object)到底會記錄哪些調用?

vao會記錄:

  1. glEnableVertexAttribArray和glDisableVertexAttribArray的調用
  2. glVertexAttribPointer的調用和glVertexAttribPointer調用時,對應的vbo對象
  3. ebo(Element Buffer Object)的綁定情況

第一個條目不再贅述,記下就完事。

對於第二個條目需要解釋一下,vao會記錄下glVertexAttribPointer的調用和glVertexAttribPointer調用時對應的vbo對象,我們知道,vbo本身只是用來儲存頂點數據的,不儲存任何“這些數據的意義”相關的信息,也就是說,對於單個vbo來說,它裏面只儲存了頂點數據,至於如何解讀這些數據、這些數據是顏色數據還是位置數據,都與vbo無關。如何解讀vbo裏的數據、vbo裏的數據是什麼,這兩個問題交由glVertexAttribPointer來解決,glVertexAttribPointer會向vao說明如何解讀vbo裏的數據,vao會記錄下這個信息,除此之外,vao還會記錄下glVertexAttribPointer調用對應的是哪個vbo對象,也就是調用glVertexAttribPointer時,正在綁定中那個的vbo。

第三個條目,vao會綁定ebo的綁定情況是指:如果在綁定vao期間,我們綁定了一個ebo對象,並且在解綁vao之前都沒有解綁這個ebo,那麼下次綁定vao的時候,將會一起綁定上這個ebo。而如果我們在vao期間解綁了ebo對象,那麼下次綁定vao的時候就不會綁定這個ebo對象。

 

 

ebo(Element Buffer Object)的作用以及順序問題?

ebo主要用於儲存頂點的繪製順序,假如我們要渲染一個正方形,我們需要六個頂點組成兩個三角形,以此來繪製一個正方形(使用glDrawArrays)。我們知道,一個正方形只有四個頂點,但是由於OpenGL只認三角形的原因,我們不得不額外地增加兩個重疊的頂點,增加了50%的內存開銷,如果繪製更多邊形,我們會增加更多的內存開銷。ebo就是爲這種情況而生,ebo可以指定頂點的繪製順序以組成三角形,假設我們要繪製一個四個頂點順時針順序爲(0,1) (1,1) (1,0) (0,0)的正方形,那麼我們可以使用一個ebo,給他一個索引數組{0,1,2,0,3,2},讓他先繪製三個頂點爲(0,1) (1,1) (1,0)的三角形,然後繪製頂點爲(0,1) (0,0) (1,0)的三角形,以拼成一個正方形。可以看到,ebo裏存的數據其實就是頂點的繪製順序,0代表vbo裏的第一個頂點,1代表第二個,以此類推,而ebo的索引,又會被三個三個地視爲三角形的頂點索引,以此來通過ebo繪製大量的三角形。

 

 

2D紋理相關的注意事項

LearnOpenGL裏講解得很好,需要複習時直接看他的講解就能理解個大概,這裏寫一些細節內容

  1. 紋理座標系和局部空間(物體空間)座標系是不同的,要注意區分,紋理座標系原點在屏幕左下角,而局部座標系原點在屏幕中心點,xy軸的方向是一致的。
  2. 要給圖形貼圖需要兩個東西,紋理座標、紋理。紋理座標一般是合併到頂點數據vbo裏一併處理,紋理需要先把圖片數據加載到內存裏然後傳給shader裏的sampler2D變量使用。
  3. glActiveTexture的參數GL_TEXTUREX(其中X是正整數),對應激活shader裏sampler2D變量,GL_TEXTURE0代表激活shader裏第一個定義的sampler2D變量,GL_TEXTURE1代表第二個定義的sampler2D變量,以此類推,激活sampler2D變量後就可以將紋理,也就是加載到內存裏的圖片數據,傳到對應的sampler2D變量。

 

 

先寫這麼多.

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章