Próbuję utworzyć wizualizator chmury punktów dynamicznych. Punkty są aktualizowane w każdej klatce za pomocą czujnika Kinect. Aby pobrać ramki, używam OpenCV i GLUT do wyświetlenia. Interfejs API OpenCV zwraca wartość 640 x 480 (liczba zmiennopozycyjna *) dla pozycji punktów xyz oraz wartość 640 x 480 (int *) dla danych koloru rgb. Aby uzyskać maksymalną wydajność, próbuję użyć Vertex Buffer Object w trybie strumieniowym zamiast prostego Vertex Array. Jestem w stanie renderować to z Vertex Array, ale nic nie jest renderowane przy mojej implementacji VBO. Próbowałem różnych deklaracji w deklaracjach, ale nie mogę znaleźć tego, czego mi brakuje. Czy ktoś może wskazać mi właściwy kierunek? Oto kod simpflified: (Ive rewrited złą wersję jako poproszony przez Christian Rau, więc wy może zrozumieć swoje błędy)Rendering Chmura punktów Kinect z obiektem bufora wierzchołków (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();
}
Dość niezwiązane komentarz: raczej użyć 'glBufferData' (zamiast' glBufferSubData') podczas aktualizowania cały bufor. To może pomóc kierowcy w optymalizacji, ale nie będę się teraz nad tym szczegółowo zastanawiać. Przynajmniej w głównym kodzie "glBufferSubData" po 'glBufferData' jest całkowicie bezużyteczny. –
Powinieneś raczej ** dołączyć ** nowe wersje twojego kodu do pytania, zamiast całkowicie zmienić kod pytania po każdej odpowiedzi lub komentarzu, ponieważ to unieważnia inne odpowiedzi i ludzie czytający pytanie i odpowiedzi kompletnie się mylą. –
Robię to przez postint jako nową odpowiedź? –