openGL ES有2種繪圖方式
- 序列繪圖
- 索引繪圖
“序列繪圖”郎哭,顧名思義就是將頂點一個個按順序排列存放在頂點緩存中缰泡。繪圖時跌帐,我們按照組成圖元頂點數(shù)量(點:一個頂點谦纱;線:兩個頂點打掘;三角形:三個頂點)一個個讀取下來按傅,并繪制形成圖形捉超。可以用下圖表示出來:
如果我們是繪制三角形唯绍,且開始偏移為0拼岳,那么可以繪制123、456兩個三角形况芒。
創(chuàng)建惜纸、綁定、緩存
buffer對象綁定的是GL_ARRAY_BUFFER
//前三個是頂點坐標(biāo)绝骚, 后面兩個是紋理坐標(biāo)
GLfloat attrArr[] =
{
0.5f, -0.5f, -1.0f, 1.0f, 0.0f,//右下 《-- 右下
-0.5f, 0.5f, -1.0f, 0.0f, 1.0f,//左上 《-- 左上
-0.5f, -0.5f, -1.0f, 0.0f, 0.0f,//左下 《-- 左下
0.5f, 0.5f, -1.0f, 1.0f, 1.0f,
-0.5f, 0.5f, -1.0f, 0.0f, 1.0f,
0.5f, -0.5f, -1.0f, 1.0f, 0.0f,
};
//創(chuàng)建一個緩存區(qū)對象,綁定到GL_ARRAY_BUFFER耐版,然后將頂點數(shù)據(jù)緩存
GLuint attrBuffer;
glGenBuffers(1, &attrBuffer);
glBindBuffer(GL_ARRAY_BUFFER, attrBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(attrArr), attrArr, GL_DYNAMIC_DRAW);
繪圖
6個點render primitives from array data
glDrawArrays(GL_TRIANGLES, 0, 6);
“索引繪圖”,頂點同樣也是存放在頂點緩存中压汪。但是在繪圖過程中粪牲,頂點讀取順序并不是按照序列順序讀取,而是根據(jù)我們提供的頂點索引讀取止剖,比方我們要繪制一個三角形腺阳,我們可以用第3個、第5個穿香、第2個這三個頂點組成亭引。用下圖表示如下:
如果我們是繪制三角形,那么是繪制352皮获、647兩個三角形焙蚓。
從上面中,我們可以看出索引繪圖方式比序列繪圖方式優(yōu)勢地方洒宝,在于:不需要定義重復(fù)頂點信息购公,可以復(fù)用之前定義過的信息,這樣可以大大減輕編碼工作雁歌;對于內(nèi)存訪問非常有效率君丁,因為大多數(shù)物體是由相似的三角形組成的,而且這些三角形有大量重復(fù)的頂點将宪,這些重復(fù)頂點占用了同一塊內(nèi)存绘闷。
創(chuàng)建、綁定较坛、緩存
buffer對象綁定的是GL_ELEMENT_ARRAY_BUFFER
例如
//頂點數(shù)據(jù)印蔗,前三個是頂點坐標(biāo), 中間三個是頂點顏色丑勤, 最后兩個是紋理坐標(biāo)
GLfloat attrArr[] =
{
-0.5f, 0.5f, 0.0f, 0.0f, 0.0f, 0.5f, 0.0f, 1.0f,//左上
0.5f, 0.5f, 0.0f, 0.0f, 0.5f, 0.0f, 1.0f, 1.0f,//右上
-0.5f, -0.5f, 0.0f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f,//左下
0.5f, -0.5f, 0.0f, 0.0f, 0.0f, 0.5f, 1.0f, 0.0f,//右下
0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.5f, 0.5f,//頂點
};
//頂點索引
GLuint indices[] =
{
0, 3, 2,
0, 1, 3,
0, 2, 4,
0, 4, 1,
2, 3, 4,
1, 4, 3,
};
self.mCount = sizeof(indices) / sizeof(GLuint);
GLuint buffer;
glGenBuffers(1, &buffer);
glBindBuffer(GL_ARRAY_BUFFER, buffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(attrArr), attrArr, GL_STATIC_DRAW);
GLuint index;
glGenBuffers(1, &index);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
繪圖
self.mCount = sizeof(indices) / sizeof(GLuint); //頂點索引位數(shù)3*6 = 18
glDrawElements(GL_TRIANGLES, self.mCount, GL_UNSIGNED_INT, 0);
r:http://blog.csdn.net/dionysos_lai/article/details/51069430