learnopengl-着色器

void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride,const GLvoid * pointer);
参数:百科解释
index:指定顶点属性的索引值
size:指定每个顶点属性的数量。必须为1、2、3或者4。初始值为4。(如position是由3个(x,y,z)组成,颜色是4个(r,g,b,a))
type:指定数组中每个组件的数据类型。可用的符号常量有GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT,GL_UNSIGNED_SHORT, GL_FIXED, 和 GL_FLOAT,初始值为GL_FLOAT。
normalized:指定当被访问时,固定点数据值是否应该被归一化(GL_TRUE)或者直接转换为固定点值(GL_FALSE)。
stride:指定连续顶点属性之间的偏移量。如果为0,那么顶点属性会被理解为:它们是紧密排列在一起的。初始值为0。
pointer:指定第一个组件在数组的第一个顶点属性中的偏移量。该数组与GL_ARRAY_BUFFER绑定,储存于缓冲区中。初始值为0;
样例数据:

如下代码:第一个参数,指定定点属性的索引。第二个参数,代表每一个单位组件的尺寸为3.第五个参数,代表连续偏移量(如数组中每一行作为一个子串数据)。第六个参数为每个子组数据中的偏移量

// 位置属性
float vertices[] = {
    // 位置              // 颜色
     0.5f, -0.5f, 0.0f,  1.0f, 0.0f, 0.0f,   // 右下
    -0.5f, -0.5f, 0.0f,  0.0f, 1.0f, 0.0f,   // 左下
     0.0f,  0.5f, 0.0f,  0.0f, 0.0f, 1.0f    // 顶部
};
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
// 颜色属性
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(3* sizeof(float)));
glEnableVertexAttribArray(1);

如下方式,同上效果一样。作为对比,便于理解

float vertices[] = {
    0.5f, -0.5f, 0.0f,  -0.5f, -0.5f, 0.0f, 0.0f, 0.5f, 0.0f, //位置信息
    1.0f,  0.0f, 0.0f,   0.0f,  1.0f, 0.0f, 0.0f, 0.0f, 1.0f//颜色信息
};

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)(9*sizeof(float)));
glEnableVertexAttribArray(1);