OpenGL 入门9

原帖地址:
http://blog.csdn.net/cordova/article/details/52564074
http://ogldev.atspace.co.uk/www/tutorial10/tutorial10.html

顺序绘制

OpenGL提供了很多钟绘制函数,glDrawArray()是其中的一个。这个函数遵循顺序绘制,也就是说我们是将vertex buffer中的顶点按照给定的图元,一个顶点接一个顶点绘制出来的。这种模式很容易实现,但是如果我们有很多个图元共享一个顶点的话,我们就必须在vertex buffer中重复存储这个顶点。

索引绘制

索引绘制需要我们使用一个全新的索引缓存,例如,我们顶点缓存中存储的数据如下:
这里写图片描述
如果按照顺序绘制,那么我们就会按照v0,v1,v2,v3…的顺序绘制。
现在我们创建一个索引缓存,顾名思义,索引缓存里存储的是顶点缓存中顶点的索引。
这里写图片描述
如上图中,我们索引缓存中的值是2,0,1,5,···,那么如果按照索引缓存中的索引来绘制顶点,则绘制的顶点的顺序是v2,v0,v1,v5,···。

代码

GLuint IBO;

声明一个全局变量用于存储我们的索引缓存的句柄。

Vertices[0] = Vector3f(-1.0f, -1.0f, 0.0f);
Vertices[1] = Vector3f(0.0f, -1.0f, 1.0f);
Vertices[2] = Vector3f(1.0f, -1.0f, 0.0f);
Vertices[3] = Vector3f(0.0f, 1.0f, 0.0f);

这是我们构成三棱体的顶点。

unsigned int Indices[] = { 0, 3, 1,
                           1, 3, 2,
                           2, 3, 0,
                           0, 1, 2 };

这是我们的索引数组。

glGenBuffers(1, &IBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Indices), Indices, GL_STATIC_DRAW);

与创建VBO一样,创建IBO也是类似的过程,不过GL_ARRAY_BUFFER需要换成GL_ELEMENT_ARRAY_BUFFER。

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO);

在渲染之前,我们需要将这个索引缓存再次绑定一下。

glDrawElements(GL_TRIANGLES, 12, GL_UNSIGNED_INT, 0);

然后就可以调用这个函数进行渲染了。GL_TRIANGLES表明我们的图元类型是三角形,我们的索引由12个GL_UNSIGNED_INT数据构成,从索引数组的第一个元素(索引为0)开始。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值