私は最近、理想的には LIDAR キャプチャからの地形データ ポイントを視覚化し、それらを約 30 fps で連続して表示できるポイント クラウド プレーヤーに取り組んでいます。しかし、私は PCI-e IO によって壁にぶつかったようです。
フレームごとに行う必要があるのは、メモリに保存されている大きなポイント クラウドをロードし、高さによるカラー マップを計算し (Matlab のジェット マップに似たものを使用しています)、データを GPU に転送することです。これは、ポイントが 100 万未満のクラウド キャプチャでうまく機能します。ただし、約 200 万ポイントで、速度が低下し始め、毎秒 30 フレームを下回ります。これは大量のデータであることを認識しています (ポイントあたり 200 万フレーム * [ポイントあたり 3 フロート + カラー ポイントあたり 3 フロート] * フロートあたり 4 バイト * 1 秒あたり 30 フレーム = 1 秒あたり約 1.34 ギガバイト) 。
現在、レンダリング コードは次のようになっています。
glPointSize(ptSize);
glEnableClientState(GL_VERTEX_ARRAY);
if(colorflag) {
glEnableClientState(GL_COLOR_ARRAY);
} else {
glDisableClientState(GL_COLOR_ARRAY);
glColor3f(1,1,1);
}
glBindBuffer(GL_ARRAY_BUFFER, vbobj[VERT_OBJ]);
glBufferData(GL_ARRAY_BUFFER, cloudSize, vertData, GL_STREAM_DRAW);
glVertexPointer(3, GL_FLOAT, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, vbobj[COLOR_OBJ]);
glBufferData(GL_ARRAY_BUFFER, cloudSize, colorData, GL_STREAM_DRAW);
glColorPointer(3, GL_FLOAT, 0, 0);
glDrawArrays(GL_POINTS, 0, numPoints);
glDisableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, 0);
vertData と colorData のポインターはフレームごとに変更されます。
私ができるようにしたいのは、後でフレームあたり最大 700 万ポイントに達する可能性のある大きな点群を使用する場合でも、最低 30 フレーム / 秒で再生できるようにすることです。これは可能ですか?それとも、それらをグリッドにして高さマップを作成し、何らかの方法で表示する方が簡単でしょうか? 私はまだ3Dプログラミングにかなり慣れていないので、アドバイスをいただければ幸いです。