函数
final float[] verticesData = {
// position // color
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.5f, -0.5f, 0.0f, 0.0f, 0.0f, 1.0f,
0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 1.0f
};
final int[] indicesData = {
0, 1, 2,
2, 3, 0
};
1、glVertexAttribPointer
glVertexAttribPointer
函数告诉OpenGL该如何解析顶点数据
GLES20.glVertexAttribPointer(
a_Color_Location,
3,
GLES20.GL_FLOAT,
false,
6 * 4,
3 * 4
);
函数的参数非常多,只关心后面两个:
void glVertexAttribPointer(
GLuint index,
GLint size,
GLenum type,
GLboolean normalized,
GLsizei stride,
const GLvoid * pointer
);
- stride
步长(Stride),它告诉我们在连续的顶点属性组之间的间隔。
对于仅连续联系排列的位置数据构成的数组,由于下个位置数据在3个float之后,我们把步长设置为 3 * sizeof(float)
。要注意的是由于我们知道这个数组是紧密排列的(在两个顶点属性之间没有空隙)我们也可以设置为0来让OpenGL决定具体步长是多少(只有当数值是紧密排列时才可用)。一旦我们有更多的顶点属性,我们就必须更小心地定义每个顶点属性之间的间隔。
- pointer
这个参数的类型是void*
,所以需要我们进行这个奇怪的强制类型转换。它表示位置数据在缓冲中起始位置的偏移量(Offset)。由于颜色数据不在数组的开头,所以这里是3 * 4 。
2、glDrawElements
GLES20.glDrawElements(
GLES20.GL_TRIANGLES,
6,
GLES20.GL_UNSIGNED_INT,
0
);
void glDrawElements(
GLenum mode,
GLsizei count,
GLenum type,
const GLvoid *indices
);
-
type
索引的类型必须是GL_UNSIGNED_BYTE
、GL_UNSIGNED_SHORT
或GL_UNSIGNED_INT
之一。 -
indices
指向存储索引的位置的指针。可以指定EBO中的偏移量(或者传递一个索引数组,但是这是当你不在使用索引缓冲对象的时候),但是我们会在这里填写0。
待续。。。