glDrawElements不使用STL向量

时间:2014-07-26 13:47:09

标签: c++ opengl vector stl

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

为了测试目的,我将渲染功能缩减为以下内容:

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继承的网格对象):

//  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()返回包含顶点(浮点数),颜色(作为无符号字节)和索引列表(作为unsigned int)的STL向量。

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

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

这可能是什么问题?我已经google了很多,但没有一个建议的解决方案适合我。

编辑:我刚注意到这个多维数据集是偶尔绘制的。这意味着它随机出现约一或两帧然后再次消失。我设法在大约一分钟内看到它两次(同时一直移动它)

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

编辑3:显示一帧的多维数据集的屏幕截图,但是,它不会显示为多维数据集......但是向量仍然包含正确的值... enter image description here

1 个答案:

答案 0 :(得分:0)

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

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

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