在我当前的项目中,我只是将我的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:显示一帧的多维数据集的屏幕截图,但是,它不会显示为多维数据集......但是向量仍然包含正确的值...
答案 0 :(得分:0)
只需将每个std::vector get...()
替换为std::vector const& get...()
即可。
在第一种情况下,创建了一个向量的副本,只需将其传递给OpenGL,然后将其丢弃。所以指向第一个向量元素的指针现在指向垃圾。
通过将其替换为第二个声明,将返回对原始矢量的引用,因此在丢弃副本后数据将保持不变,因为仍然存在原始数据。