从 std::map 中的向量获取数据

Getting data from vector in an std::map

本文关键字:向量 获取 数据 std map      更新时间:2023-10-16

我正在尝试编写一个从.3ds文件渲染模型的类,但我遇到了一个非常烦人的问题。我有一个从整数到双精度向量的映射映射

map<int, vector<double> >

我用来映射具有不同材料属性的顶点。之后,我尝试遍历所有密钥并让 OpenGL 像这样渲染它们:

glPushMatrix();
glPushClientAttrib(GL_CLIENT_ALL_ATTRIB_BITS);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
for(map<int, vector<double> >::iterator iter = myMaterialVertices.begin(); iter != myMaterialVertices.end(); iter++)
{
    vector<double> test = iter->second;
    glVertexPointer(3, GL_DOUBLE, 0, test.data());
    //get the texture coords here
    glDrawArrays(GL_TRIANGLES, 0, iter->second.size() / 3);
}
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glPopClientAttrib();
glPopMatrix();

不幸的是,这每次都会在 glDrawArrays 调用上给我一个错误,告诉我我正在尝试读取地址 0。我将其解释为存在空指针问题,因此我放入测试向量以确保数据在那里。向量加载正确,但仍给出相同的错误。我做错了什么?

既然在评论中提出了建议,我将提出答案。对

glEnableClientState(GL_TEXTURE_COORD_ARRAY);

使 OpenGL 期望指向纹理坐标数组的指针。如果未指定任何内容,则会引发空指针异常(尝试读取0x00000000)。这里的教训是不要启用客户端状态,除非你计划定义适当的指针。