1.glGenBuffers,函数原型:void glGenBuffers(GLsizei n,GLuint * buffers);
第一个参数是要生成的缓冲对象的数量,第二个是缓冲对象名称。
个人理解:声明一个GLuint变量,然后使用glGenBuffers后,它就会把缓冲对象保存在vbo里,当然也可以声明一个数组类型,那么创建的3个缓冲对象的名称会依次保存在数组里。此时vbo就代表了显卡缓存的一个地址,从而可以用vbo去操作显卡缓存中的数据。
GLuint vbo;
glGenBuffers(1,&vbo);
GLuint vbo[3];
glGenBuffers(3,vbo);
glGenBuffers()函数仅仅是生成一个缓冲对象的名称,这个缓冲对象并不具备任何意义。
2.glBindBuffer,函数原型:void glBindBuffer(GLenum target,GLuint buffer);
第一个参数是一个宏,代表缓冲对象的类型,第二个参数就是要绑定的缓冲对象的名称,也就是在上一个函数里生成的名称。
该函数将缓冲对象绑定到OpenGL上下文环境中以便使用,缓冲对象可以理解为轨道,数据为火车,不同的火车需要不同的轨道。
glBindBuffer(GL_ARRAY_BUFFER, VBO);
3.glBufferData,函数原型:void glBufferData(GLenum target,GLsizeiptr size,const GLvoid * data,GLenum usage);
第一个参数是指定目标缓冲区对象,必须为GL_ARRAY_BUFFER或GL_ELEMENT_ARRAY_BUFFER。第二个参数是指定缓冲区对象的新数据存储的大小(以字节为单位)。第三个参数是指定将复制到数据存储区以进行初始化的数据的指针。第四个是指定数据的预期使用模式,必须为GL_STREAM_DRAW,GL_STATIC_DRAW或GL_DYNAMIC_DRAW。
STREAM:数据存储内容将被修改一次并最多使用几次。
STATIC:数据存储内容将被修改一次并多次使用。
DYNAMIC:数据存储内容将被重复修改并多次使用。
访问的性质必须是DRAW:数据存储内容由应用程序修改,并用作GL绘图和图像规范命令的源。 该函数作用是把内存数据转移到显卡缓存。 尽量一次性将大量数据传给GPU,因为CPU->GPU是很慢的 缓冲区对象只是OpenGL众多对象中的一种,其实当我们使用其它对象时,都是类似的思路:创建对象,绑定类型,设置数据。
4.OpenGL顶点数组对象(vertex Array Object)VAO
|