void glVertexAttribPointer( GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void * pointer);
- 第一个参数指定了我们想要配置的顶点属性。还记得我们在顶点着色器中使用它layout(location = 0)定义了position顶点属性的位置值(Location)是吗?它可以将顶点属性的位置值设置为0。因为我们想把数据传输到这个顶点属性,所以我们在这里传输到0。
- 第二个参数指定顶点属性的大小。顶点属性是一个vec三、它由三个值组成,因此大小为3。
- 第三个参数指定数据的类型,这里是GL_FLOAT(GLSL中vec*它们都由浮点值组成)。
- 下一个参数定义了我们是否希望数据标准化(Normalize)。假如我们设置为GL_TRUE,所有数据都会映射到0(对于符号型)signed数据是-1)到1之间。我们把它设置为GL_FALSE。
- 第五个参数叫步长(Stride),它告诉我们连续顶点属性组之间的间隔。因为下一组的位置数据是三个float之后,我们将步长设置为3 * sizeof(float)。需要注意的是,我们也可以将这个数组设置为0,因为我们知道这个数组排列紧密(两个顶点属性之间没有间隙)OpenGL确定步长是多少(只有当数值排列紧密时才能使用)。一旦我们有了更多的顶点属性,我们必须更仔细地定义每个顶点属性之间的间隔,我们以后会看到更多的例子(注: 这个参数意味着从这个属性第二次出现的地方到整个数组0位置之间有多少字节)。
- 最后一个参数的类型是void*,因此,我们需要转换这种奇怪的强制类型。它表示缓冲中位置数据的偏移(Offset)。这里是0,因为位置数据在数组的开头。