在学习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
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!