私は動的ポイントクラウドビジュアライザを作成しようとしています。ポイントは、Kinectセンサーでフレームごとに更新されます。フレームをつかむために、私はOpenCVとGLUTを使って表示しています。 OpenCV APIは、ポイントxyzの位置では640 x 480(float *)、rgbカラーデータでは640 x 480(int *)を返します。 最高のパフォーマンスを得るために、私は単純な頂点配列の代わりに頂点バッファオブジェクトをストリームモードで使用しようとしています。私はVertex Arrayでレンダリングすることができますが、私のVBO実装では何もレンダリングされていません。私は宣言の中でさまざまな命令を練りましたが、私が見逃しているものは見つけられません。誰かが私を正しい方向に向けることができますか?ここでsimpflifiedコードは次のとおりです(クリスチャン・ラウで尋ねたとして、君たちが私の過ちを理解することができるようにI'veは、間違ったバージョンを書き換え中)頂点バッファオブジェクト(VBO)を使用したKinectポイントクラウドのレンダリング
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();
}
全く無関係コメント:バッファ全体を更新する場合、むしろ(代わりglBufferSubData' 'の)' glBufferData'を使用I've三点の変更を行います。これはドライバーが物事を最適化するのに役立つかもしれませんが、ここでは詳しく説明しません。少なくともメインコードでは、 'glBufferData'に続く' glBufferSubData'は全く役に立たない。 –
**各回答またはコメントの後に質問のコードを完全に変更するのではなく**新しいバージョンのコードを**質問に追加すると、他の回答が無効になり、質問と回答を読む人が完全に混乱するためです。 –
私は新しい回答としてpostintでこれを行いますか? –