В последнее время я работаю над плеером облаков точек, который в идеале должен иметь возможность визуализировать точки данных местности с помощью лидарного захвата и отображать их последовательно со скоростью около 30 кадров в секунду. Я, однако, похоже, пришел к стене в результате PCI-e IO.
Что мне нужно сделать для каждого кадра, так это загрузить большое облако точек, сохраненное в памяти, затем рассчитать карту цветов по высоте (я использую что-то похожее на карту струй Matlab), а затем перенести данные в графический процессор. Это отлично работает при захвате облаков с точками <миллион. Тем не менее, примерно в 2 миллиона точек, это начинает замедляться ниже 30 кадров в секунду. Я понимаю, что это много данных (2 миллиона кадров на точку * [3 плавающих на точку + 3 плавающих на цветную точку] * * 4 байта на плавающий * 30 кадров в секунду = <strong>около 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 изменяется каждый кадр.
То, что я хотел бы иметь, - это возможность проигрывать со скоростью не менее 30 кадров в секунду, даже если позднее используются большие облака точек, которые могут достигать до 7 миллионов точек на кадр. Это вообще возможно? Или, может быть, было бы проще объединить их в сетку, построить карту высот и как-то отобразить это? Я все еще довольно плохо знаком с трехмерным программированием, поэтому любой совет будет оценен.