Intento hacer un visualizador de nube de puntos dinámico. Los puntos se actualizan en cada cuadro con Kinect Sensor. Para agarrar los marcos, estoy usando OpenCV y GLUT para visualizar. La API de OpenCV arroja un 640 x 480 (float *), para la posición de los puntos xyz, y un 640 x 480 (int *) para los datos de color rgb. Para obtener el máximo rendimiento, estoy tratando de usar Vertex Buffer Object en modo transmisión en lugar de una simple Vertex Array. Puedo renderizarlo con Vertex Array, pero no se está procesando nada con mi implementación de VBO. Intenté un montón de órdenes diferentes en las declaraciones, pero no puedo encontrar lo que me falta. ¿Alguien puede tratar de señalarme en la dirección correcta? Aquí está el código simpflified: (he reescrito la versión incorrecta, tal como solicitó por Christian Rau, así que ustedes pueden entender mis errores)Representación de Kinect Point Cloud con Vertex Buffer Object (VBO)
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();
}
comentario sin relación alguna: en lugar usar 'glBufferData' (en lugar de' glBufferSubData') al actualizar el búfer entero. Esto podría ayudar al conductor a optimizar las cosas, pero no voy a entrar en detalles sobre eso ahora. Al menos en el código principal, el 'glBufferSubData' que sigue a' glBufferData' es completamente inútil. –
Debería ** adjuntar ** nuevas versiones de su código a la pregunta, en lugar de cambiar completamente el código de la pregunta después de cada respuesta o comentario, ya que esto invalida otras respuestas y las personas que leen la pregunta y las respuestas se confunden por completo. –
Lo hago por postint como una nueva respuesta? –