序列绘图和索引绘图
2017-09-29 本文已影响48人
FongG
openGL ES有2种绘图方式
- 序列绘图
- 索引绘图
“序列绘图”,顾名思义就是将顶点一个个按顺序排列存放在顶点缓存中。绘图时,我们按照组成图元顶点数量(点:一个顶点;线:两个顶点;三角形:三个顶点)一个个读取下来,并绘制形成图形。可以用下图表示出来:
20160406000517221.png 如果我们是绘制三角形,且开始偏移为0,那么可以绘制123、456两个三角形。
创建、绑定、缓存
buffer对象绑定的是GL_ARRAY_BUFFER
//前三个是顶点坐标, 后面两个是纹理坐标
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,
};
//创建一个缓存区对象,绑定到GL_ARRAY_BUFFER,然后将顶点数据缓存
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);
“索引绘图”,顶点同样也是存放在顶点缓存中。但是在绘图过程中,顶点读取顺序并不是按照序列顺序读取,而是根据我们提供的顶点索引读取,比方我们要绘制一个三角形,我们可以用第3个、第5个、第2个这三个顶点组成。用下图表示如下:
如果我们是绘制三角形,那么是绘制352、647两个三角形。
从上面中,我们可以看出索引绘图方式比序列绘图方式优势地方,在于:不需要定义重复顶点信息,可以复用之前定义过的信息,这样可以大大减轻编码工作;对于内存访问非常有效率,因为大多数物体是由相似的三角形组成的,而且这些三角形有大量重复的顶点,这些重复顶点占用了同一块内存。
创建、绑定、缓存
buffer对象绑定的是GL_ELEMENT_ARRAY_BUFFER
例如
//顶点数据,前三个是顶点坐标, 中间三个是顶点颜色, 最后两个是纹理坐标
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); //顶点索引位数3*6 = 18
glDrawElements(GL_TRIANGLES, self.mCount, GL_UNSIGNED_INT, 0);
r:http://blog.csdn.net/dionysos_lai/article/details/51069430