我正在尝试制作一个动态点云可视化器。这些点每帧都会通过Kinect传感器更新。我使用OpenCV和GLUT来捕获帧并显示。
OpenCV API返回一个大小为640×480的浮点数数组,表示点的xyz位置,以及一个大小为640×480的整数数组,表示RGB颜色数据。
为了获得最大的性能,我尝试使用流模式的顶点缓冲对象而不是简单的顶点数组。我可以使用顶点数组进行渲染,但使用VBO实现时没有任何渲染。我尝试了许多不同的声明顺序,但找不到我漏掉了什么。有人能指点我正确的方向吗?以下是简化后的代码:(我已经按照Christian Rau的要求改写了错误版本,所以你们可以理解我的错误)
int main()
{
//Delaring variables, inittiating glut, setting camera and checking the compatibility as http://www.songho.ca/opengl/gl_vbo.html
glutDisplayFunc(displayCB);
glutIdleFunc(displayCB);
...
//Inittiating the vertex buffers
if(vboSupported)
{
glGenBuffers(1, &vertex_buffer);
glBindBuffer(GL_ARRAY_BUFFER_ARB, buffer);
glBufferData(GL_ARRAY_BUFFER_ARB, (sizeof(GLfloat) * 640 * 480 * 3), 0, GL_STREAM_DRAW_ARB);
glBufferSubData(GL_ARRAY_BUFFER_ARB, 0, (sizeof(float) * 640 * 480 * 3), point_cloud.points_position);
glGenBuffers(2, &color_buffer);
glBindBuffer(GL_ARRAY_BUFFER_ARB, buffer);
glBufferData(GL_ARRAY_BUFFER_ARB, (sizeof(GLbyte) * 640 * 480 * 3), 0, GL_STREAM_DRAW_ARB);
glBufferSubData(GL_ARRAY_BUFFER_ARB, 0, (sizeof(char) * 640 * 480 * 3), point_cloud.points_color);
}
//glutMainLoop(), cleaning memory, ending main
..
}
//Updating the screen
void displayCB()
{
point_cloud.update();
// clear buffer
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
// save the initial ModelView matrix before modifying ModelView matrix
glPushMatrix();
glBindBuffer(GL_ARRAY_BUFFER_ARB, color_buffer);
glBufferSubData(GL_ARRAY_BUFFER_ARB, 0, (sizeof(char) * 640 * 480 * 3), point_cloud.points_color);
glColorPointer(3, GL_UNSIGNED_BYTE, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER_ARB, vertex_buffer);
glBufferSubData(GL_ARRAY_BUFFER_ARB, 0, (sizeof(float) * 640 * 480 * 3), point_cloud.points_position);
glVertexPointer(3, GL_FLOAT, 0, 0));
// enable vertex arrays
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glDrawArrays(GL_POINT, 0, 640*480);
glDisableClientState(GL_VERTEX_ARRAY); // disable vertex arrays
glDisableClientState(GL_COLOR_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER_ARB, 0);
glPopMatrix();
glutSwapBuffers();
}
glBufferData
(而不是glBufferSubData
)。这可能有助于驱动程序优化,但我现在不会详细介绍。至少在主代码中,glBufferData
后面的glBufferSubData
是完全无用的。 - Christian Rau...
,但它仍然无法工作/现在我有这些错误...”或类似的内容。但是,如果更改相当重要,你不应该覆盖你现有的问题代码,特别是当这会使其他答案失效时。 - Christian Rau