vtk渲染窗口GetZbufferData方法

时间:2017-12-17 11:50:21

标签: vtk

据我了解,如果我创建一个vtk渲染窗口,那么我可以为它添加不同的渲染器,并且每个渲染器从不同的角度渲染。不实际渲染场景我使用vtk渲染窗口方法render()来并行渲染所有渲染器。现在有一个名为GetZbufferData的vtk渲染窗口方法,它显然返回一个包含zbuffer的数组。所以我的问题是,这个zbuffer对应哪个渲染器? 谢谢你的任何澄清。

2 个答案:

答案 0 :(得分:1)

如果所有渲染器都在同一个窗口中,那么它们将共享相同的帧缓冲区,因此也是相同的z缓冲区。所以对你的问题的简单回答是“对所有人”。要获取单个z值,这取决于您对渲染器的确切操作。

如果您正在进行某种“平铺视图”,则需要为每个渲染器分配不同的视口(vtkRenderer::SetViewport(),如here)。然后,您可以通过将适当的x,y坐标传递给GetZBufferData函数来访问给定“tile”(渲染器)的z数据。例如,要获取属于vtkRenderWindow ren1的渲染器renWin的z缓冲区的整个部分:

double x1 = ren1->GetViewport()[0] * (renWin->GetSize()[0] - 1);
double y1 = ren1->GetViewport()[1] * (renWin->GetSize()[1] - 1);
double x2 = ren1->GetViewport()[2] * (renWin->GetSize()[0] - 1);
double y2 = ren1->GetViewport()[3] * (renWin->GetSize()[1] - 1);

float *ren1Z = renWin->GetZbufferData(
  static_cast<int>(x1),static_cast<int>(y1),static_cast<int>(x2),
  static_cast<int>(y2));

如果您有相同的视口,则会更复杂。通过设置vtkRenderWindow::SetNumberOfLayers(int),您可以拥有包含多个“图层”的渲染窗口,然后您可以将每个渲染器分配到不同的图层(vtkRenderer::SetLayer(0-based layer index))。然后窗口从第0层渲染到最后一层。如果您只想获得一个特定渲染器的z数据,那么如果您在最后一层渲染它,则应该得到它。但是,我不确定是否在各个渲染器的渲染之间清理了z缓冲区,我实际上打赌它不是,所以你可能也会得到一些不一致的混乱。

答案 1 :(得分:0)

我想补充tomj answer

任何vtkRenderWindow :: GetZbufferData()方法都会向帧缓冲区查询Z值,该值包含在vtkRenderWindow中,但有一点说明:

您需要在渲染器中进行设置:vtkRenderer :: PreserveDepthBufferOn()。这是因为作为documentation says

“默认情况下,将为每个渲染器重置深度缓冲区。 如果此标志为true,则此渲染器将使用现有的深度缓冲区进行渲染。“

因此,这将我们带到了vtkRenderers。 vtkRenderers有一层,可以告诉您制作绘图的“链”或“优先顺序”。检查方法vtkRenderer::SetLayer()

因此,您首先需要设置分层的vtkRenderers,将它们附加到vtkRenderWindow,然后再正确设置(如果要保留或不保留某些深度缓冲区)。

请注意,如果尚未设置z缓冲区(第一个vtkRenderer的第一次绘制),它将返回1.0。我仍在找出原因,但目前就是这种情况。