使用頂點陣列時,往往要將所有需要使用的頂點放入陣列中,以便於統一呼叫。
比如一條折線:
glfloat vpoints = ;
在頂點陣列中,需要對端點1進行2次儲存,因為線段0是由端點0、端點1兩個端點構成,而線段1是由端點1、端點2兩個端點構成,必須順序儲存所有呼叫的點,才可以用gldrawarrays進行統一的呼叫。即gldrawarrays用於一次性將指定記憶體區間的所有點繪製出來,不可以使用索引。
當然,用glarrayelement來訪問單個元素可以避免該問題。但訪問單個元素效率較低。
為了既保證效率,又減少儲存空間,可以使用索引頂點陣列。
索引頂點陣列就是僅儲存所有必要點,然後額外建立乙個用於索引的陣列。
同一條折線:
glfloat vpoints = ;
gluint indexs = ;
這樣,就使用2個陣列代替了原來的1個陣列。
在繪製圖形較少的情況下,這樣做並不一定節省記憶體。但當繪製圖形非常多的時候,這種方式對記憶體的節省會很可觀。
陣列定義完成後,呼叫:
glfloat vpoints[126];
對每個元素進行賦值。
glenableclientstate(gl_vertex_array); //啟用頂點陣列
glvertexpointer(3, gl_float, 0, vpoints); //設定頂點陣列屬性
gldrawelements(gl_lines, 4, gl_unsigned_int, indexs);
其中,gldrawelements用於呼叫索引來繪製圖形。該函式不需要在glbegin/glend之間呼叫。
void gldrawelements(glenum mode, glsizei count, glenum type, const glvoid *indices);
引數:
1.
glenum mode:指定繪製圖元的型別,取值為:gl_points, gl_line_strip, gl_line_loop,gl_lines, gl_********_strip, gl_********_fan, gl_********s, gl_quad_strip,gl_quads, gl_polygon
2.
glsizei count:為繪製圖元的數量乘上乙個圖元的頂點數。也就是指所有繪製的圖元的頂點數之和。這裡2條線段,共4個頂點,所以這裡為4。在這個例子中這個引數等於索引陣列的元素個數。
3.
glenum type:為索引值的型別,取值為:gl_unsigned_byte, gl_unsigned_short,gl_unsigned_int。注意
gl_unsigned_byte
對應的值為
unsigned byte
,只有8
位,其有效值最大僅為
255。所以除非所繪圖形的頂點數小於
255,否則不要用該值。推薦使用
gl_unsigned_int
。4.
const
2 8 頂點陣列物件
上一節介紹了緩衝區物件,緩衝區就是個記憶體塊,緩衝區物件 圖形伺服器中的記憶體塊 乙個id。頂點陣列,是為了減少函式呼叫數量,為了避免共享頂點的冗餘,而將頂點放在陣列中。那頂點陣列物件呢?頂點陣列物件,就是 頂點陣列 乙個id名稱。然後通過這個名稱,來對這個頂點陣列進行訪問。為了方便在不同的頂點陣列...
用頂點陣列繪製立方體
code include include include static glfloat vertices static glfloat vertices static glubyte front static glubyte right static glubyte back static glub...
opengl光照之漫反射逐頂點渲染與逐畫素渲染
1,逐頂點渲染 模型中有多少個頂點就計算多少次,這種方式比較節約系統資源,但效果比較粗糙 2,逐畫素渲染 這種方式計算量特別大,有多少個畫素就計算多少次,但是效果會很好 逐頂點渲染漫反射光照效果 頂點shader attribute vec3 pos 頂點座標 attribute vec2 texc...