在GLES 3.0中函数的参数形式如下所示:
glVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);
例子:glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
第一个参数:顶点属性的位置。
举个例子:顶点位置数组是要传递给顶点着色器的,顶点着色器的输入参数是:顶点属性。顶点可以有很多的属性,例如:顶点位置属性,顶点颜色属性等。
所以在顶点着色器源程序中会指定输入的顶点属性的location,如下所示:
char vShaderStr[] =//顶点着色器source code
"#version 300 es \n"
"layout(location = 0) in vec4 aColor; \n"
"layout(location = 1) in vec4 aPosition; \n"
"out vec4 vColor; \n"
"void main() \n"
"{ \n"
" vColor = aColor; \n"
" gl_Position = aPosition; \n"
"} \n";
上面代码中location = 1用来表示传递给顶点着色器的第1个属性,这个属性是顶点着色器的位置属性。
所以:glVertexAttribPointer的第一个参数是标明此次传递的是哪个属性,在本例中,第一个参数设置为0表示传递给顶点着色器的是颜色属性,设置为1表示传递的是位置属性。
第二个参数指定顶点属性的大小。顶点位置属性是一个vec3,它由3个值组成,所以大小是3。
第三个参数指定顶点位置属性中元素的类型:float
第四个参数我设置为GL_FALSE,博文上面的解释不是很明白,先贴出来
第四个参数参数定义我们是否希望数据被标准化(Normalize)。如果我们设置为GL_TRUE,所有数据都会被映射到0(对于有符号型signed数据是-1)到1之间。我们把它设置为GL_FALSE。
第五个参数是:步长,因为我顶点位置向量中每个位置点由3个float类型组成,所以这里设置为3 * sizeof(float)
第六个参数:可以直接传递顶点位置向量的首地址
具体参考如下教程:
https://learnopengl-cn.github.io/01%20Getting%20started/04%20Hello%20Triangle/
我在理解第一个参数上出现了偏差,现在明白了,上面的教程写的非常好!