float vertercies[] =
{ - - 从上面的顶点数据可以看出,这4个点刚好就是normalized device space的四个边界的顶点。
- 指定2个三角形的索引
我们需要为两个三角形指定索引数据,如下所示:
GLubyte indices[] = { 2,
3,87)">1};
|
- 创建索引缓冲区并绑定索引数据到缓冲区
1
2
3
4
|
GLuint indexVBO;
glGenBuffers(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,indexVBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER,sizeof(indices),indices,GL_STATIC_DRAW);
|
这里索引缓冲区与之前的GL_ARRAY_BUFFER的创建与使用方式是一样的。
- 最后,我们把glDrawArray替换成glDrawElements
1
|
glDrawElements(GL_TRIANGLES,87)">6,GL_UNSIGNED_BYTE,(GLvoid*)0);
|
-
第一个参数:指定绘制基本图元的类型,这里我们指定的是三角形
-
第二个参数:需要绘制的元素个数,即索引的数量,我们一共是6个索引
-
第三个参数:指定索引数据的类型,注意必须是 GL_UNSIGNED_BYTE和GL_UNSIGNED_SHORT中的一个。推荐用GL_UNSIGNED_BYTE。
-
第四4个参数:指定开始绘制的第一个索引数据在缓冲区的偏移。
此时,编译并运行,我们还是得到了和之前一样的四边形。
改进顶点数据结构
现在顶点属性包含位置(position)和颜色(color),将来还会有法线(normal),纹理坐标(texture coordinate)等数据。如果每一种类型的顶点数据都分开来存放,一来不利于管理,二来也会产生内存碎片。
在本小节中,我将向大家介绍如何使用一个结构体来封装这些数据。这也是cocos2d-x里面所用的方法,比如一个Quard的定义如下:
1
2
3
4
5
6
7
8
9
|
struct V3F_C4B_T2F
{
Vec3 vertices;
Color4B colors;
Tex2F texCoords;
};
|
仿照上面的结构体,我们也定义一个结构体Vertex,用来表示顶点的数据,目前它里面包含位置和颜色:
typedef struct {
float Position[2];
float Color[4];
} Vertex;
|
下面是我们的顶点数据定义:
Vertex data[] =
{
{ {-1},{1} },
{ { { {-1} }
};
|
注意,我们画四边形需要4个顶点,所以,需要四份Vertex数据。接下来,我们指定Vertex Shader如何读取这些属性:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
glVertexAttribPointer(positionLocation,
GL_FLOAT,
GL_FALSE,
sizeof(Vertex),
(GLvoid* )offsetof(Vertex,Position));
GLuint colorLocation = glGetAttribLocation(program->getProgram(),"a_color");
glEnableVertexAttribArray(colorLocation);
glVertexAttribPointer(colorLocation,87)">4,Color));
|
这里,我们需要指定glVertexAttribPointer的第5个参数和第6个参数。
下图告诉我们Vertex Shader是如何读取属性的: multiplevertexattri
注意,我们这里把colorVBO的生成和绑定代码注释掉了,因为已经不需要了。 编译并运行,这时候你还是会看到一个绿色的四边形。
结语
从本例中可以看到,VBO可以一次性传递所有的顶点数据给vertex shader(目前是position和color,以后还有法线和纹理坐标),然后使用glVertexAttribPointer按一定的规则去取数据就行了。至于几何图元如何组装,可以交给索引VBO去解决,最后调用glDrawElements来完成实际的绘制。
另外如果我们只想画纯色的四边形,那么建议不要使用attribute,直接使用uniform并把该uniform的值传给gl_FragColor就行了。这个就留给读者自行去实验啦。
本教程源码下载地址
推荐阅读
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|