首页 > 代码库 > 使用VBO对glVertexAttribPointer的影响
使用VBO对glVertexAttribPointer的影响
在openGL中glVertexAttribPointer使用来上传顶点数据到显卡的方法。这里的顶点数据是数组的形式。函数原型如下
void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *ptr) // index: 着色器脚本对应变量ID // size : 此类型数据的个数 // type : 此类型的sizeof值 // normalized : 是否对非float类型数据转化到float时候进行归一化处理 // stride : 此类型数据在数组中的重复间隔宽度,byte类型计数 // ptr : 数据指针, 这个值受到VBO的影响
在不使用VBO的情况下:事情是这样的,ptr就是一个指针,指向的是需要上传到顶点数据指针。通常是数组名的偏移量。
在使用VBO的情况下:首先要glBindBuffer,以后ptr指向的就不是具体的数据了。因为数据已经缓存在缓冲区了。这里的ptr指向的是缓冲区数据的偏移量。这里的偏移量是整型,但是需要强制转换为const GLvoid *类型传入。注意的是,这里的偏移的意思是数据个数总宽度数值。
比如说:这里存放的数据前面有3个float类型数据,那么这里的偏移就是,3*sizeof(float).
最后解释一下,glVertexAttribPointer的工作原理:
- 首先,通过index得到着色器对应的变量openGL会把数据复制给着色器的变量。
- 以后,通过size和type知道当前数据什么类型,有几个。openGL会映射到float,vec2, vec3 等等。
- 由于每次上传的顶点数据不止一个,可能是一次4,5,6顶点数据。那么通过stride就是在数组中间隔多少byte字节拿到下个顶点此类型数据。
- 最后,通过ptr的指针在迭代中获得所有数据。
那么,最最后openGL如何知道ptr指向的数组有多长,读取几次呢。是的,openGL不知道。所以在调用绘制的时候,需要传入一个count数值,就是告诉openGL绘制的时候迭代几次glVertexAttribPointer调用。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。