VTK使用深度剥离depth peeling保证透明视图渲染正常

深度剥离depth peeling(GPU)使用

半透明情况下普通render渲染效果异常的原因:为了提高渲染效率,一般情况下默认使用的是alpha blending(alpha混合),即只渲染最近的一面;因而当半透明显示时就会有问题,此时可以使用depth peeling(深度剥离)
深度剥离通常通过深度测试来渲染场景,将最近的片段返回给眼睛。在第二次传递中,前一次传递的深度缓冲区被绑定到一个片段着色器。为了避免读-修改-写危险,源和目标深度缓冲区在每次传递时都会交换(ping pong)。如果片段深度小于或等于前一次测试的相关深度,那么这个片段将被丢弃,深度测试将返回下面的下一层。

还有一种dual dedpth peeling,区别在于从概念上讲,双深度剥离是指从前后和从前后两个方向进行深度剥离,每次从前面去一层,从后面去一层。
如果GPU有多个深度缓冲区,并且每个深度缓冲区与特定的颜色纹理相关联,那么这将很容易实现。有一个RGB纹理用于前后混合,一个RGBA纹理用于前后混合。中间的层将被剥离并在前后和前后混合纹理中混合。

深度剥离Tips

  1. 深度剥离算法是从前到后逐层剥离透明的几何物体,直到没有可渲染的物体为止;
  2. 达到所设置的最大迭代次数时迭代停止(SetMaximumNumberOfPeels);
  3. 上一次剥离所修改的像素数目比预先设置的窗口的百分比区域对应的像素数还少时停止迭代,0.0(SetOcclusionRatio)表示精确结果。
  • 使用深度剥离前提是显卡支持(仅英伟达),可用语句测试本机是否能使用这个方法

    vtkSmartPointer<vtkRenderer> _vtkRenderer = vtkSmartPointer<vtkRenderer>::New();
    vtkSmartPointer<vtkRenderWindow> _vtkRenderWindow = vtkSmartPointer<vtkRenderWindow>::New();
    _vtkRenderWindow->AddRenderer(_vtkRenderer);
    
    //It performs per pixel sorting (better result) but it is really slow
    // 1. Use a render window with alpha bits (as initial value is 0 (false)):
    _vtkRenderWindow->SetAlphaBitPlanes(1);
    //Make sure multisampling is disabled :
    // 2. Force to not pick a framebuffer with a mult
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VTK(Visualization Toolkit)是一个开源的跨平台的图形处理工具包。它提供了丰富的数据结构和算法,可以用于可视化和图形处理。在VTK使用CUDA加速处理渲染,可以提高渲染的速度。 以下是使用CUDA加速处理渲染的步骤: 1. 安装CUDA工具包。在使用CUDA加速处理渲染之前,必须先安装CUDA工具包。CUDA工具包可以从NVIDIA官方网站下载。下载完成后,按照安装向导进行安装。 2. 配置VTK。在使用CUDA加速处理渲染之前,必须先配置VTK。在CMake中,设置VTK_USE_CUDA选项为ON,然后重新生成项目。 3. 使用VTK的CUDA加速渲染。在使用CUDA加速处理渲染时,可以使用VTKvtkCudaVolumeRayCastMapper或vtkCudaVolumeMapper类。这些类可以将体数据转换为CUDA格式,并使用CUDA内核进行渲染。 下面是一个简单的VTK CUDA加速渲染的例子: ``` #include <vtkSmartPointer.h> #include <vtkVolume.h> #include <vtkRenderer.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> #include <vtkCudaVolumeRayCastMapper.h> #include <vtkImplicitModeller.h> int main(int argc, char *argv[]) { vtkSmartPointer<vtkImplicitModeller> modeller = vtkSmartPointer<vtkImplicitModeller>::New(); modeller->SetSampleDimensions(128, 128, 128); modeller->SetOrigin(-1, -1, -1); modeller->SetSpacing(0.02, 0.02, 0.02); modeller->SetMaximumDistance(0.1); modeller->SetModelBounds(-1, 1, -1, 1, -1, 1); modeller->ComputeNormalsOff(); modeller->SetOutputScalarTypeToFloat(); vtkSmartPointer<vtkCudaVolumeRayCastMapper> mapper = vtkSmartPointer<vtkCudaVolumeRayCastMapper>::New(); mapper->SetInputConnection(modeller->GetOutputPort()); mapper->SetBlendModeToComposite(); mapper->SetMaximumImageSampleDistance(0.01); mapper->SetAutoAdjustSampleDistances(0); mapper->SetUseJittering(1); mapper->SetImageSampleDistance(0.005); mapper->SetMinimumImageSampleDistance(0.001); mapper->SetMaximumImageSampleDistance(0.01); mapper->SetSampleDistanceAdjustmentFactor(1.0); mapper->SetMaximumNumberOfRaySamples(1000); mapper->SetImageSampleDistance(0.005); vtkSmartPointer<vtkVolume> volume = vtkSmartPointer<vtkVolume>::New(); volume->SetMapper(mapper); vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New(); renderer->AddVolume(volume); vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New(); renderWindow->AddRenderer(renderer); vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New(); interactor->SetRenderWindow(renderWindow); renderWindow->Render(); interactor->Start(); return 0; } ``` 在这个例子中,我们使用vtkImplicitModeller来创建一个体数据,然后使用vtkCudaVolumeRayCastMapper类将它渲染出来。在vtkCudaVolumeRayCastMapper类中,我们设置了一些渲染参数,例如采样距离、最大采样数等等。最后,我们将渲染结果添加到vtkRenderer中,并将vtkRenderWindow显示出来。 需要注意的是,使用CUDA加速处理渲染需要显卡支持CUDA技术,否则无法加速处理。同时,CUDA加速渲染并不一定能够提高渲染速度,它的效果取决于数据的复杂度和显卡性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值