Sto cercando di creare un visualizzatore di nuvole di punti dinamico. I punti vengono aggiornati ogni fotogramma con il sensore Kinect. Per afferrare i fotogrammi sto usando OpenCV e GLUT da mostrare. L'API OpenCV restituisce un 640 x 480 (float *), per la posizione dei punti xyz e un 640 x 480 (int *) per i dati del colore rgb. Per ottenere le massime prestazioni, sto cercando di utilizzare Vertex Buffer Object in modalità stream invece di una semplice Vertex Array. Sto riuscendo a renderlo con Vertex Array, ma nulla viene reso con la mia implementazione VBO. Ho provato un sacco di ordini diversi nelle dichiarazioni, ma non riesco a trovare quello che mi manca. Qualcuno può provare a indicarmi la giusta direzione? Ecco il codice simpflified: (Ive riscritto la versione sbagliata, come chiesto da Christian Rau, così voi ragazzi può capire i miei errori)Rendering nuvola di punti Kinect con VBO (Vertex Buffer Object)
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();
}
commento abbastanza estranei: piuttosto usare 'glBufferData' (invece di' glBufferSubData') quando si aggiorna l'intero buffer. Questo potrebbe aiutare il guidatore a ottimizzare le cose, ma non approfondirò su questo ora. Almeno nel codice principale il 'glBufferSubData' che segue un' glBufferData' è completamente inutile. –
Dovresti piuttosto ** aggiungere ** nuove versioni del tuo codice alla domanda, invece di cambiare completamente il codice della domanda dopo ogni risposta o commento, in quanto ciò invalida altre risposte e le persone che leggono la domanda e le risposte si confondono completamente. –
Lo faccio da postint come una nuova risposta? –