LearnOpenGL中glBufferData中传入的数据为什么是容器的第一个元素,而不是整个容器?

在学习LearnOpenGL第三章《导入模型》的《网格》中有一个问题一直没有搞明白,就是
glBufferData中传入的数据为什么是容器的第一个元素,而不是整个容器?

struct Vertex {
    glm::vec3 Position;
    glm::vec3 Normal;
    glm::vec2 TexCoords;
};

vector<Vertex> vertices;
vector<unsigned int> indices;

void setupMesh()
{
    glGenVertexArrays(1, &VAO);
    glGenBuffers(1, &VBO);
    glGenBuffers(1, &EBO);

    glBindVertexArray(VAO);
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
     
     // 这里的&vertices[0]为什么不是&vertices
    glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(Vertex), &vertices[0], GL_STATIC_DRAW);  

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
     //  这里的&indices[0]为什么不是&indices
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof(unsigned int), 
                 &indices[0], GL_STATIC_DRAW);

    // 顶点位置
    glEnableVertexAttribArray(0);   
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)0);
    // 顶点法线
    glEnableVertexAttribArray(1);   
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, Normal));
    // 顶点纹理坐标
    glEnableVertexAttribArray(2);   
    glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, TexCoords));

    glBindVertexArray(0);
}  

glBufferData函数的第三个参数是const GLvoid *类型,&indices[0]是取vector中第一个元素的地址,
它的类型是unsigned int *,可以转换为GLvoid *类型,
并且vector类型的存储空间是连续的,也就是说,
通过&indices[0]是可以访问到vector中的所有元素的。
----------------------------------------------
GLvoid* 默认要求是传入连续空间数据,而&indices的类型是vector<unsigned int > *类型,
这个类型转换的时候,得到的数据是多个vector<unsigned int >元素,
虽然单个vector<unsigned int >中的元素是连续的,
但是多个vector<unsigned int >之间的地址却是相互独立的。
所以这里用的是&indices[0],而不是&indices
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632