Dinamik nokta bulutu görselleştiricisi oluşturmaya çalışıyorum. Noktalar Kinect Sensor ile her çerçevede güncellenir. Ekranları açmak için OpenCV ve GLUT kullanarak ekrana geliyorum. OpenCV API'si, xyz konumu için 640 x 480 (float *) ve rgb renk verisi için 640 x 480 (int *) döndürür. En yüksek performansı elde etmek için, Vertex Buffer Nesnesini basit bir Vertex Array yerine akış modunda kullanıyorum. Vertex Dizisi ile işleyebiliyorum, ancak VBO uygulamamla hiçbir şey yapılmıyor. Deklarasyonlarda bir sürü farklı sipariş denedim, ama neyi kaçırdığımı bulamıyorum. Birisi beni doğru yöne yönlendirmeye çalışabilir mi? (Christian Rau tarafından sorulan olarak hep şeffaf yanlış sürümü rewrited, böylece siz benim hataları anlayabileceği)Vertex Arabellek Nesnesi (VBO) ile Kinect Point Cloud Oluşturma
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();
}
Oldukça ilgisiz açıklama: Tüm tampon güncellenirken ziyade (yerine glBufferSubData' 'arasında)' glBufferData' kullanmak boyunca hep şeffaf üç değişikliği yapılır. Bu, sürücünün bazı şeyleri iyileştirmesine yardımcı olabilir, ancak şu anda ayrıntıya girmeyeceğim. En azından ana kodda 'glBufferData' sonrası' glBufferSubData' tamamen işe yaramaz. –
Soruya cevap veren ve cevapları tamamen karıştıran diğer cevapları geçersiz kılacağından, ** her bir cevap veya yorumdan sonra soruyu tamamen değiştirmek yerine, kodunuzun ** yeni sürümlerini sorgusuna eklemelisiniz. –
Bunu postint ile yeni bir cevap olarak yapıyorum? –