你如何将glVerttexAttribPointer与glBufferData结合使用?

时间:2012-09-06 03:50:04

标签: ipad opengl-es-2.0 vertex-buffer

在iOS 5的股票“旋转立方体”OpenGL示例中,他们有以下代码:

glBufferData(GL_ARRAY_BUFFER, sizeof(gCubeVertexData), gCubeVertexData, GL_STATIC_DRAW);

glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(0));
glEnableVertexAttribArray(GLKVertexAttribNormal);
glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(12));

混乱的部分是glVertexAttribPointer的最后一个参数。 The docs说最后一个参数是指向数组的指针。

但是在这个程序中他们使用的是直号。实际上,BUFFER_OFFSET被定义为

#define BUFFER_OFFSET(i) ((char *)NULL + (i))

他们是否依赖于从内存地址0开始的gCubeVertexData数组?

所以,我不明白两件事:

  1. 为什么示例不起作用(没有绘制多维数据集)当我“纠正”第3行代码

    glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 24, gCubeVertexData );
    
  2. 调用glVertexAttribPointer的正确方法是什么?

  3. 我认为你应该为文档中的最后一个索引传递一个内存指针。实际上,这里another sample使用glVertexAttribPointer:

    glVertexAttribPointer(ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, sizeof(vertexStruct), &vertices[0].position);
    glEnableVertexAttribArray(ATTRIB_POSITION);
    glVertexAttribPointer(ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(vertexStruct), &vertices[0].color);
    glEnableVertexAttribArray(ATTRIB_COLOR);
    

    所以你在后一个例子中看到他们已经为指针(最后一个arg)传递内存地址,而不是直接数字。

1 个答案:

答案 0 :(得分:2)

glVertexAttribPointer有两种使用方式:

1)使用客户端侧顶点数组。在这种情况下,最后一个参数是一个指向数组的指针,你对此是正确的。

2)除了用作指针外,如果您在链接的文档页面中进一步阅读,它会说:

  

如果在指定通用顶点属性数组时将非零命名缓冲区对象绑定到GL_ARRAY_BUFFER目标(请参阅glBindBuffer),则将指针视为缓冲区对象的数据存储中的字节偏移量。

当您使用glVertexAttribPointer指向VBO时,这是您之前上传到opengl的缓冲区(glBindBuffer / glBufferData)。

澄清:

如果没有与glBindBuffer绑定的活动缓冲区,glVertexAttribArray将获取指针。如果你确实有一个缓冲区绑定,那么glVertexAttribArray会在绑定缓冲区中获取一个偏移量。如果要从缓冲区的开头开始绘制,这将是值0