У меня есть фрагмент, который преобразует рендеринг vtk (off screen) в 1) облако точек; 2) Цветное изображение. Реализация правильна, это просто проблема/эффективность.Эффективность VTK vtkRenderWindow :: GetZbufferData и vtkWindowToImageFilter :: Update
В начале каждой итерации, я обновляю свой рендеринг по телефону:
renderWin->Render();
Для облака точек, я получаю глубину, используя следующую строку, а затем преобразовать его в точку облака (код не отвечал).
float *depth = new float[width * height];
renderWin->GetZbufferData (0, 0, width - 1, height - 1, &(depth[0]));
Для цветного изображения, я использую vtkWindowToImageFilter
, чтобы получить текущий цвет вынесенное изображение:
windowToImageFilter->Modified(); // Must have this to get updated rendered image
windowToImageFilter->Update(); // this line takes a lot of time
render_img_vtk = windowToImageFilter->GetOutput();
Над программой работает в одной и той же нити последовательно. Размер renderWindow составляет около 1000x1000. Не нужно много полидат. VTK был скомпилирован с поддержкой OpenGL2.
Выпуск: Этот код работает только 15-20Hz, когда я отключил/комментировать windowToImageFilter
часть (vtkWindowToImageFilter::Update()
занимает много времени), фреймрейт идет до 30Гц. Когда я отключил/комментировал vtkRenderWindow::GetZbufferData
, он поднимается до 50 Гц (как быстро я вызываю свой цикл и обновляю рендеринг).
Я быстро просмотрел исходный файл VTK этих двух функций, я вижу, что он копирует данные с помощью команды GL. Я не уверен, как я могу ускорить это.
Update: После некоторого поиска я обнаружил, что функция glReadPixels
называется в GetZbufferData
причины задержки, как это пытаются синхронизировать данные. Пожалуйста, см. Это сообщение: OpenGL read pixels faster than glReadPixels. В этом сообщении предлагается использовать PBO. VTK имеет класс vtkPixelBufferObject
, но для его использования не существует примера, чтобы избежать блокировки трубопровода, когда это делается glReadPixels()
Как я могу это сделать в трубопроводе VTK?
Спасибо за ответ, я сделал вещь, вы предложили (обновленный пост), но результат тот же. Я также обнаружил, что PBO (пиксельный буферный объект) должен использоваться, могли бы вы помочь с этим? –