【问题标题】:glDrawElements not working with STL vectorglDrawElements 不适用于 STL 矢量
【发布时间】:2014-07-26 13:47:08
【问题描述】:

在我当前的项目中,我只是将我的 Mesh 类的每个数组指针更改为一个 STL 向量,因为在原始向量之后使用指向 std::vector::front() 的指针时遇到问题,因为它们是在函数中本地定义的而被丢弃。到目前为止它工作正常,但 OpenGL 甚至不会使用顶点数组绘制一个简单的立方体。

出于测试目的,我已将渲染功能缩减为以下:

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
//replacement for the deprecated glLookAt, which is unavailable in Mesa 10.1 (what I use)
util_compat_gluLookAt(posX+cx,posY+cy,posZ+cz, posX,posY,posZ, 0,1,0);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glPushMatrix();

glTranslatef(posX,posY,posZ);
glRotatef(spectator_longitude*180/M_PI, 0,1,0);

glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);

glColorPointer(4, GL_UNSIGNED_BYTE, 0, &cube.getColors().front());
glVertexPointer(3, GL_FLOAT, 0, &cube.getVertices().front());
glDrawElements(GL_QUADS, cube.getIndices().size(), GL_UNSIGNED_INT, &cube.getIndices().front());

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);

glPopMatrix();

//These WCS axes are drawn without problem
glLineWidth(3);
glBegin(GL_LINES);
glColor3f(1,0,0);
glVertex3f(0,0,0);
glVertex3f(100,0,0);
glColor3f(0,1,0);
glVertex3f(0,0,0);
glVertex3f(0,100,0);
glColor3f(0,0,1);
glVertex3f(0,0,0);
glVertex3f(0,0,100);
glEnd();

SDL_GL_SwapWindow(screen);

向量(和网格对象,player 从中继承)在 gameloop 文件中包含的头文件中定义:

//  vertices
std::vector<float> vertices {
    -5,0,-5,
    5,0,-5,
    -5,10,-5,
    -5,0,5,
    5,10,-5,
    5,0,5,
    -5,10,5,
    5,10,5
};
//  Color buffer
std::vector<unsigned byte> colors {
    0,0,0,255,
    255,0,0,255,
    0,255,0,255,
    0,0,255,255,
    255,255,0,255,
    255,0,255,255,
    0,255,255,255,
    255,255,255,255
};
//  Vertex index buffer
std::vector<unsigned int> indices {
    0,1,4,2,
    0,2,6,3,
    0,3,5,1,
    1,4,7,5,
    5,7,6,3,
    2,6,7,4
};

cube.getVertices()、cube.getColors() 和 cube.getIndices() 方法返回包含顶点(作为浮点数)、颜色(作为无符号字节)和索引列表(作为无符号整数)的 STL 向量。

根据 GDB 调试器,这些向量包含正确的值。由于我使用--std=c++11 进行编译,因此向量保证是连续的。

相同的渲染过程,只使用数组(分别是指向它们的第一个元素的指针)而不是向量,没有任何问题。现在只绘制 WCS 轴上的线。移动多维数据集(使用 SDL 事件处理)仍然有效,gluLookAt 替换函数可以按预期工作。

这可能是什么问题?我用谷歌搜索了很多,但没有一个建议的解决方案对我有用。

编辑:我只是注意到立方体是零星绘制的。这意味着它随机出现大约一两帧,然后再次消失。我设法在大约一分钟内看到它两次(同时一直在移动它)

编辑 2: 这绝对不是驱动程序问题,因为在使用 xserver-xorg-video-ati(XOrg XServer AMD/ATI 驱动程序)和使用 fglrx(AMD Catalyst 驱动程序)时都会出现所描述的行为对于 XServer)

编辑 3: 出现一帧的立方体的屏幕截图,但是,它没有显示为立方体......但向量仍然包含正确的值......

【问题讨论】:

  • 如何将这些值放入向量中?
  • '在被丢弃的原始向量之后,因为不再需要了。'嗯?
  • 目前向量被硬编码在头文件中。另一个对象(从渲染中删除以进行调试)从文件中加载。两者都包含预期值。 after the original vectors where discarded as the weren't needed any more.-> 我创建了一个 Stanford PLY 加载器,它使用本地向量,然后返回指向它们第一个条目的指针。离开加载器后,在加载器函数中定义的向量被释放。

标签: c++ opengl vector stl


【解决方案1】:

只需将每个std::vector get...() 替换为std::vector const&amp; get...() 即可。

在第一种情况下,创建了向量的副本,只需将其传递给 OpenGL,然后将其丢弃。所以指向第一个向量元素的指针现在指向垃圾。

通过将其替换为第二个声明,返回对原始向量的引用,因此在丢弃副本后数据将保持不变,因为仍然存在原件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-06
    • 2014-09-09
    • 2018-10-31
    • 1970-01-01
    • 2019-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多