這篇文章其實(shí)不必寫,這位博主講得已經(jīng)很好了http://www.cnblogs.com/kesalin/archive/2012/12/20/vbo.html鸵熟。
還是提出來(lái)的原因是亮蒋,這是一步步的路:
為什么我們要使用VBO扣典?
使用頂點(diǎn)緩存(VBO)能夠大大減少CPU-GPU 之間的數(shù)據(jù)拷貝開銷,因此顯著地提升了程序運(yùn)行的效率慎玖。
既然如此贮尖,那就一定要用VBO。這篇文章我就將《OpenGLES-05 立方體3D變換》里的代碼改為VBO趁怔,閱讀VBO使用請(qǐng)點(diǎn)上面鏈接就好湿硝。
若繪制圖形眾多,你還需考慮使用VAO润努,VAO用法也是比較簡(jiǎn)單的关斜,對(duì)性能提升也很大。這里就提一下铺浇,大家有興趣可以研究下:
每當(dāng)我們繪制一個(gè)幾何體時(shí)痢畜,我們需要重復(fù)同樣的工作(首先綁定緩沖區(qū)、然后設(shè)置頂點(diǎn)屬性)。當(dāng)需要繪制的物體很多時(shí)丁稀,這個(gè)過(guò)程就顯得有些耗時(shí)繁涂。那么我們有沒(méi)有一種方式來(lái)簡(jiǎn)化這一過(guò)程呢?這就是VAO做的事情二驰,它將所有頂點(diǎn)繪制過(guò)程中的這些設(shè)置和綁定過(guò)程集中存儲(chǔ)在一起扔罪,當(dāng)我們需要時(shí),只需要使用相應(yīng)的VAO即可桶雀。
VAO的這種方式有點(diǎn)像一個(gè)中介矿酵,把所有繁瑣的綁定和頂點(diǎn)設(shè)置工作都集中起來(lái)處理,我們需要繪制時(shí)矗积,直接找這個(gè)中介就好了全肮。
所有教程代碼在此 : https://github.com/qingmomo/iOS-OpenGLES-
-(void)render
{
//設(shè)置清屏顏色,默認(rèn)是黑色,如果你的運(yùn)行結(jié)果是黑色棘捣,問(wèn)題就可能在這兒
glClearColor(0.3, 0.5, 0.8, 1.0);
/*
glClear指定清除的buffer
共可設(shè)置三個(gè)選項(xiàng)GL_COLOR_BUFFER_BIT辜腺,GL_DEPTH_BUFFER_BIT和GL_STENCIL_BUFFER_BIT
也可組合如:glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
這里我們只用了color buffer,所以只需清除GL_COLOR_BUFFER_BIT
*/
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST); //添加
// Setup viewport
glViewport(0, 0, self.frame.size.width, self.frame.size.height);
GLfloat vertices[] = {
-0.5f, -0.5f, 0.5f, 1.0, 0.0, 0.0, 1.0, // red
-0.5f, 0.5f, 0.5f, 1.0, 1.0, 0.0, 1.0, // yellow
0.5f, 0.5f, 0.5f, 0.0, 0.0, 1.0, 1.0, // blue
0.5f, -0.5f, 0.5f, 1.0, 1.0, 1.0, 1.0, // white
0.5f, -0.5f, -0.5f, 1.0, 1.0, 0.0, 1.0, // yellow
0.5f, 0.5f, -0.5f, 1.0, 0.0, 0.0, 1.0, // red
-0.5f, 0.5f, -0.5f, 1.0, 1.0, 1.0, 1.0, // white
-0.5f, -0.5f, -0.5f, 0.0, 0.0, 1.0, 1.0, // blue
};
// GLfloat vertices[] = {
// -0.5f, -0.5f, 0.5f,
// -0.5f, 0.5f, 0.5f,
// 0.5f, 0.5f, 0.5f,
// 0.5f, -0.5f, 0.5f,
//
// 0.5f, -0.5f, -0.5f,
// 0.5f, 0.5f, -0.5f,
// -0.5f, 0.5f, -0.5f,
// -0.5f, -0.5f, -0.5f,
// };
GLubyte indices[] = {
// Front face
0, 3, 2, 0, 2, 1,
// Back face
7, 5, 4, 7, 6, 5,
// Left face
0, 1, 6, 0, 6, 7,
// Right face
3, 4, 5, 3, 5, 2,
// Up face
1, 2, 5, 1, 5, 6,
// Down face
0, 7, 4, 0, 4, 3
};
GLuint vertexBuffer;
glGenBuffers(1, &vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
GLuint indexBuffer;
glGenBuffers(1, &indexBuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
glVertexAttribPointer(_positionSlot, 3, GL_FLOAT, GL_FALSE, 7 * sizeof(float), 0);
glVertexAttribPointer(_colorSlot, 4, GL_FLOAT, GL_FALSE, 7 * sizeof(float), (const GLvoid*)(3 * sizeof(GLfloat)));
glEnableVertexAttribArray(_positionSlot);
glEnableVertexAttribArray(_colorSlot);
glDrawElements(GL_TRIANGLES, sizeof(indices)/sizeof(GLubyte), GL_UNSIGNED_BYTE, 0);
[_context presentRenderbuffer:_renderBuffer];
glDeleteBuffers(1, &vertexBuffer);
glDeleteBuffers(1, &indexBuffer);
}