【发布时间】:2011-11-25 13:05:49
【问题描述】:
我正在尝试制作一个动态点云可视化工具。使用 Kinect 传感器每帧都会更新这些点。为了抓取我正在使用 OpenCV 和 GLUT 显示的帧。 OpenCV API 为点 xyz 位置返回 640 x 480 (float *),为 rgb 颜色数据返回 640 x 480 (int *)。 为了获得最大的性能,我尝试在流模式下使用顶点缓冲区对象而不是简单的顶点数组。我能够用顶点数组渲染它,但我的 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完全没用。 -
您应该将代码的新版本追加到问题中,而不是在每个答案或评论之后完全更改问题的代码,因为这会使其他答案和阅读问题和答案完全混淆了。
-
我通过 postint 作为新答案来做到这一点?
-
不,您只需像这样编辑您的问题:“更新:根据...的回答/评论,我将代码/...部分更改为
...,但它仍然没有工作/现在我有这些错误......”或类似的东西。但是您不应该只覆盖现有的问题代码(至少在更改相当重要时不这样做),尤其是当这会使其他答案无效时。 -
既然您已经解决了问题,您可以考虑将解决方案添加为答案,然后将其标记为这样,以便从未回答列表中删除此问题。
标签: c++ opengl stream kinect vbo