我很困惑glVertexAttribPointer
如何与VBO一起使用。从here可以清楚地看出,前一个参数是内存中的偏移量(两个顶点数据之间的距离),而last是指向特定属性的顶点数据的内存的指针。即如果我有这样的数据:
GLfloat vVertices[] = { 0.0f, 0.5f, 0.0f,
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f };
glVertexAttribPointer(index, 3, GL_FLOAT, GL_FALSE, 0, vVertices);
glEnableVertexAttribArray(index);
然后我们说使用vVertices
来设置顶点位置。我们指定3个浮点数构成一个顶点,偏移量为0。
但是我们如何在VBO中使用它?我们将最后两个参数设置为0,对吧?为什么?这个案子怎么样:
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
typedef struct {
float Position[2];
float Color[4];
} Vertex;
Vertex data[] =
{
{ { -1, -1 }, { 0, 1, 0, 1 } },
{ { 1, -1 }, { 0, 1, 0, 1 } },
{ { -1, 1 }, { 0, 1, 0, 1 } },
{ { 1, 1 }, { 0, 1, 0, 1 } }
};
GLubyte indices[] = { 0, 1, 2, // first triangle index
2, 3, 1 }; // second triangle index
glGenBuffers(1, &vertexVBO);
glBindBuffer(GL_ARRAY_BUFFER, vertexVBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW);
GLuint positionLocation = glGetAttribLocation(program->getProgram(), "a_position");
glEnableVertexAttribArray(positionLocation);
glVertexAttribPointer(positionLocation, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid *)offsetof(Vertex, Color));
glGenBuffers(1, &colorVBO);
glBindBuffer(GL_ARRAY_BUFFER, colorVBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW);
GLuint colorLocation = glGetAttribLocation(program->getProgram(), "a_color");
glEnableVertexAttribArray(colorLocation);
glVertexAttribPointer(colorLocation, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid *)offsetof(Vertex, Color));
为什么我们指定32
和0x00008
作为设置颜色属性数据的最后两个参数?请解释如何将glVertexAttribPointer
与VAO和VBO一起使用。
答案 0 :(得分:4)
最后两个参数称为stride
和offset
。
stride
表示OpenGL需要多少字节来增加VBO内的指针才能获得下一个顶点的属性。或者换句话说,从1个顶点到下一个顶点有多少字节。
offset
表示VBO中数据开始的位置。
两者均以基本机器单位表示。
glVertexAttribPointer(positionLocation, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid *)offsetof(Vertex, Position));
glVertexAttribPointer(colorLocation, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid *)offsetof(Vertex, Color));