首页 > 其他 > 详细

使用VBO对glVertexAttribPointer的影响

时间:2014-08-08 12:55:36      阅读:442      评论:0      收藏:0      [点我收藏+]

在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调用。


使用VBO对glVertexAttribPointer的影响,布布扣,bubuko.com

使用VBO对glVertexAttribPointer的影响

原文:http://blog.csdn.net/tom_221x/article/details/38434925

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!