首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >vtk呈现窗口GetZbufferData方法

vtk呈现窗口GetZbufferData方法
EN

Stack Overflow用户
提问于 2017-12-17 19:50:21
回答 2查看 495关注 0票数 1

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

EN

回答 2

Stack Overflow用户

发布于 2017-12-18 17:49:41

如果在同一窗口中具有所有渲染器,则它们将共享相同的帧缓冲区,因此也共享相同的z缓冲区。因此,对您的问题的简单回答是“致所有人”。要获得单独的z值,这取决于您对渲染器所做的具体操作。

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

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2018-10-23 03:21:52

我想补充一下tomj answer

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

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

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

所以,这就把我们带到了vtkRenderers。vtkRenderers有一个层次,它告诉我们要绘制的是“链”还是“优先顺序”。检查方法vtkRenderer::SetLayer()

因此,您首先需要设置您的分层vtkRenderers,将它们附加到vtkRenderWindow,然后正确设置是否要保留一些深度缓冲区。

请注意,如果z-buffer尚未设置(第一个vtkRenderer的第一个绘制),它将返回1.0。我仍在弄清楚原因,但目前情况就是这样。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47854808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档