vtkRenderWindow :: GetZbufferData和vtkWindowToImageFilter :: Update

时间:2016-02-17 22:38:23

标签: vtk

我有一个片段将vtk(屏幕外)渲染转换为1)点云; 2)彩色图像。实施是正确的,只是速度/效率是一个问题。

在每次迭代开始时,我通过调用:

更新我的渲染
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。不需要渲染很多polydata。 VTK是在OpenGL2支持的情况下编译的。

问题: 此代码仅运行大约15-20Hz,当我禁用/评论windowToImageFilter部分(vtkWindowToImageFilter::Update()花费大量时间)时,帧速率大约为30Hz。 当我禁用/评论vtkRenderWindow::GetZbufferData时,它会上升到50Hz(这就是我调用循环并更新渲染的速度)。

我快速浏览了这两个函数的VTK源文件,我看到它使用GL命令复制数据。我不知道如何才能加快速度。

更新 经过一些搜索后,我发现glReadPixels中调用的GetZbufferData函数在尝试同步数据时会导致延迟。请参阅此帖:OpenGL read pixels faster than glReadPixels。 在这篇文章中,建议使用PBO。 VTK有一个类vtkPixelBufferObject,但是没有找到使用它来避免阻塞管道的示例glReadPixels()

那么我怎样才能在VTK管道中做到这一点?

1 个答案:

答案 0 :(得分:2)

我的回答是关于GetZbufferData部分。

glReadPixels已经使用了vtkOpenGLRenderWindow,但我所知道的开销很小。 here

之后会发生什么,我相信会引入开销。需要注意的是GetZbufferData vtkWindowToImageFilter有3个方法重载。您使用的方法重载与vtkWindowToImageFilter here

中使用的签名相同

我相信你正在复制depthBuffer中的部分实现,这完全有道理。你得到浮点指针vtkWindowToImageFilter后怎么办?查看memcpy实现,我发现他们有一个调用memcpy here的for循环。由于变量inIncrYoutIncrY,我认为他们的memcpy必须处于for循环中才能处理间距。对于您的情况,您只需要调用depthBuffer一次,然后释放new指向的数组。除非你只是使用指针。然后你必须考虑谁必须删除那个浮点数组,因为它是用int GetZbufferData( int x1, int y1, int x2, int y2, vtkFloatArray* z )创建的。

我认为更好的选择是使用带有此签名的方法:import vtk # create render pipeline (not shown) # define image bounds (not shown) vfa = vtk.vtkFloatArray() ib = image_bounds render_window.GetZbufferData(ib[0], ib[1], ib[2], ib[3], vfa)

在看起来像这样的python中:

vtkFloatArray

主要好处是glReadPixels的指针直接传递给vtkFloatArray。此外,如果使用vtkSmartPointer(在Python中不需要)创建它,vtk将采用string userId = User.Identity.Name; 的垃圾收集

我的python实现在一次传递中以大约150Hz运行。在640x480渲染窗口上。

编辑:以150Hz运行