c++ - 从 std::map 中的 vector 获取数据

标签 c++ opengl

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

map<int, vector<double> >

我用来映射具有不同 Material 属性的顶点。之后,我尝试遍历所有键并让 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。我将其解释为存在空指针问题,因此我放入了测试 vector 以确保数据在那里。 vector 被正确加载但仍然给出相同的错误。我做错了什么?

最佳答案

既然在评论中提出了建议,我会提出一个答案。调用

glEnableClientState(GL_TEXTURE_COORD_ARRAY);

使 OpenGL 期待一个指向纹理坐标数组的指针。当没有指定时,它会抛出空指针异常(尝试读取 0x00000000)。这里的教训是,除非您计划定义适当的指针,否则不要启用客户端状态。

关于c++ - 从 std::map 中的 vector 获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13521367/

相关文章:

opengl - 当我更新顶点缓冲区对象时,应该如何更新顶点数组对象?

c++ - 有没有办法确定每个 GL_LINE 元素将写入多少像素?

c++ - 使用顶点着色器确定线方向

c++ - 为什么在尝试使i = i * i时出现错误 “using uninitialized memory ' i'”和 “uninitialized local variable '我已使用”

C++ 如何拥有相同方法的不同版本?

c++ - 在 C/C++ 中是否有类似极度优化的 memcpy2d 之类的东西?

c++ - 在循环中顺序遍历成员变量

c++ - macOS 上莫名其妙的 OpenGL 着色器行为

opengl - 是否可以创建固定大小的过剩窗口?

c++ - 如何将十六进制转换为基数为10的字节