【发布时间】: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 加载器,它使用本地向量,然后返回指向它们第一个条目的指针。离开加载器后,在加载器函数中定义的向量被释放。