关于attribute pointer的理解请看上一篇文章。
gl3官方文档的解释:
void glVertexAttribPointer( GLuint index,
GLint size,
GLenum type,
GLboolean normalized,
GLsizei stride,
const GLvoid * pointer);
Parameters
index
Specifies the index of the generic vertex attribute to be modified.
size
Specifies the number of components per generic vertex attribute. Must be 1, 2, 3, 4. Additionally, the symbolic constant GL_BGRA
is accepted by glVertexAttribPointer
. The initial value is 4.
type
Specifies the data type of each component in the array. The symbolic constants GL_BYTE
, GL_UNSIGNED_BYTE
, GL_SHORT
, GL_UNSIGNED_SHORT
, GL_INT
, and GL_UNSIGNED_INT
are accepted by both functions. Additionally GL_HALF_FLOAT
, GL_FLOAT
, GL_DOUBLE
, GL_INT_2_10_10_10_REV
, and GL_UNSIGNED_INT_2_10_10_10_REV
are accepted by glVertexAttribPointer
. The initial value is GL_FLOAT
.
normalized
For glVertexAttribPointer
, specifies whether fixed-point data values should be normalized (GL_TRUE
) or converted directly as fixed-point values (GL_FALSE
) when they are accessed.
stride
Specifies the byte offset between consecutive generic vertex attributes. If stride
is 0, the generic vertex attributes are understood to be tightly packed in the array. The initial value is 0.
pointer
Specifies a offset of the first component of the first generic vertex attribute in the array in the data store of the buffer currently bound to the GL_ARRAY_BUFFER
target. The initial value is 0.
偏移量(const void*)pointer代表的是从atrribute pointer的哪里开始读取数据。
比如一组atrribute pointer内部有6个GL_FLOAT,分别是3个位置坐标和3个颜色通道,那我们在布置VAO时怎么告诉OpenGL我的颜色GL_FLOAT在哪呢?
以上图VAO2为例,我们会想:一共有15组attribute pointer,一组attribute pointer是6*GL_FLOAT(步长stride,单位是字节)大小,颜色前面有3个位置GL_FLOAT(偏移量pointer,单位是字节),颜色自己有3个GL_FLOAT(向量大小size,以类型为单位,比如GL_FLOAT)。那么VAO配置函数应该写为
glVertexAttribPointer(
0,
3,
GL_FLOAT,
GL_FALSE,
6*sizeof(GL_FLOAT),
(const void*)3*sizeof(GL_FLOAT);