1.glGenBuffers 官方解释:generate buffer object names

unsigned int VBO;
glGenBuffers(1, &VBO);

void glGenBuffers(GLsizei n,GLuint * buffers);

第一个参数是要生成的缓冲对象的数量,第二个是要输入用来存储缓冲对象名称的数组,

该函数会在buffers里返回n个缓冲对象的名称。

一言以蔽之:将n个当前未使用的缓冲对象名称(也就是ID),保存到buffers所指的内存区域中。

当然也可以声明一个unsigned int 数组,那么创建的n个缓冲对象的ID会依次保存在数组里。

unsigned int VBO[3];
glGenBuffers(3,VBO);

 也就是说,这时候VBO内会是一个从未被使用过的缓冲对象的ID,类似于给缓冲区起名字,起了一个独一无二名字。

注意:glGenBuffers()函数仅仅是生成一个缓冲对象的名称,这个缓冲对象并不具备任何意义,它是个没有类型的缓冲对象,它类似于C语言中的一个指针变量,我们可以分配内存对象并且用它的名称来引用这个内存对象。OpenGL有很多缓冲对象类型,那么这个缓冲对象到底是什么类型,就要用到下面的glBindBuffer()函数了。

2.glBindBuffer 官方解释:bind a named buffer object

void glBindBuffer(GLenum target,GLuint buffer);

参数:

target:缓冲对象的类型,可以为GL_ARRAY_BUFFER或GL_ELEMENT_ARRAY_BUFFER。buffer:指定缓冲区对象的名称(ID),也就是我们用glGenBuffers 生成的名称。

glBindBuffer函数完成了三项工作:
1、如果是第一次绑定buffer,且buffer是一个非0的unsigned int。那么将创建一个新的target类型的缓冲对象,并命名为buffer,或者说buffer指向这个缓冲对象。
2、如果buffer是一个已经创建的缓冲对象,那么它将成为当前被激活的target类型的缓冲对象。
3、如果buffer为0,那么OpenGL将不再对当前target应用任何缓冲对象。

OpenGL允许我们同时绑定多个缓冲类型,只要这些缓冲类型是不同的,换句话说,同一时间,不能绑定两个相同类型的缓冲对象

glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
06-02 00:41