使用VBO时glVertexAttribPointer的最后两个参数

时间:2015-05-26 08:09:54

标签: c++ opengl opengl-es

我很困惑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));

为什么我们指定320x00008作为设置颜色属性数据的最后两个参数?请解释如何将glVertexAttribPointer与VAO和VBO一起使用。

1 个答案:

答案 0 :(得分:4)

最后两个参数称为strideoffset

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));