OpenGL学习脚印:缓冲对象相关函数的使用(buffer object function usage)

写在前面
OpenGL中还包含除了我们前面介绍的VAO,VBO,EBO等其他类型的缓冲对象。关于如何使用这些缓冲对象的手册或者参考书籍上解释得非常详细,但是阅读起来确实很枯燥无味
本文将通过简洁、可靠的例子说明一些重要方法的使用,以辅助学习这些方法。本文的目的不是写成详细而厚重的手册,对于文中未详细说明的部分,请参考官方文档。
学习这些内容的过程需要随着实践慢慢积累,因此本文也将随着实践进行,不断更新。本节示例代码均可以在我的github下载

buffer object的概念

在OpenGL中,缓存对象(buffer object)是由OpenGL的绘制上下文(context),也即是GPU分配的,存储未格式化的数据的区域,例如存储顶点数据,帧缓冲数据等。

缓存对象中的数据实际上就是原始的字节流,例如我们在程序中指定顶点属性数据,然后使用glBufferData​这个函数将数据从CPU中传送至GPU中,这一步只完成了数据的上传,关于这份数据,OpenGL是不知道其具体格式的,因此在实际使用中还必须告诉OpenGL如何具体使用这些数据,这是通过glVertexAttribPointer这样的函数来完成的。

每个缓存对象,必须绑定到一个具体的目标(target)后,OpenGL才知道如何具体操作这个缓存对象,例如绑定到GL_ARRAY_BUFFER,OpenGL使用这个缓存对象作为顶点属性数据;例如绑定到GL_ELEMENT_ARRAY_BUFFER,则OpenGL使用这个缓存对象的数据作为索引绘图的索引数据。

缓存对象的数据,也存在读写、复制、清除等操作,同时缓存对象在适当时候也可以使用 glDeleteBuffers​这类函数释放。

下面通过简洁的例子介绍一些重要方法的使用。

glVertexAttribPointer

这个函数的使用容易引起一些混淆,尤其是末尾两个参数。

API void glVertexAttribPointer( GLuint index,
GLint size,
GLenum type,
GLboolean normalized,
GLsizei stride,
const GLvoid * pointer);
1. 参数index 表示顶点属性的索引 这个索引即是在顶点着色器中的属性索引,索引从0开始记起。
2. 参数size 每个属性数据由几个分量组成。例如上面顶点每个属性为3个float组成的,size即为3。分量的个数必须为1,2,3,4这四个值之一。
3. 参数type表示属性分量的数据类型,例如上面的顶点数据为float则填写GL_FLOAT.
4. 参数normalized 表示是否规格化,当存储整型时,如果设置为GL_TRUE,那么当被以浮点数形式访问时,有符号整型转换到[-1,1],无符号转换到[0,1]。否则直接转换为float型,而不进行规格化。
5. 参数stride表示连续的两个顶点属性之间的间隔,以字节大小计算。当顶点属性紧密排列时,可以用初始值为0,这时OpenGL将自动推算出stride。
6. 参数pointer表示当前绑定到的 GL_ARRAY_BUFFER缓冲区中,顶点属性的第一个分量在数据中的偏移量,以字节为单位计算。初始值为0。

这个函数末尾的两个参数,stride表示缓存对象中连续两个顶点属性之间的间隔,而offset则表示顶点属性的第一个分量在这儿缓存对象数据中的位置偏移量。具体的计算第 i 个分量的方式为(参考自SO):

startPos(i)=offset+istride

  • 13
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值