VTK实现电影级渲染效果(CVR)

2023-05-16

        目前vtk9.2.2版本中已经集成了ray marching(光线步进)算法实现的体渲染功能,官方博客中已经介绍为电影级体渲染了,如图:

 

7ee3210fa8054ea08c712772bcecc34e.png

        此效果是在3d显示器上的显示效果,就此效果来看说是电影级渲染效果也没什么问题,但是和光线追踪来实现的CVR还是差一些,下图为光线追踪的方法来实现的CVR。

a8e5325045734c5b916768491b7946a3.png

        首先可以先了解下这几个名词概念

Ray Marching 光线步进 基本只用于volumetric(体积绘制)

RayTracing 光线追踪 在与物体相交后会选一个随机方向继续跟踪,并根据BRDF计算颜色(全局照明 (GI),反射)

Ray Casting 光线投射 该算法的计算不会停留在物体的表面,而会沿着射线穿过物体内部进行采样,且不会产生二次射线。我们在VTK中使用的vtkGPUVolumeRayCastMapper就是光线投射原理。

        VTK实现Ray Marching也是基于光线投射的mapper,只是加了两个接口控制。并且最好自己加上灯光,且控制灯光的旋转等。

    vtkNew<vtkGPUVolumeRayCastMapper> mapper;
	mapper->SetAutoAdjustSampleDistances(0);
	mapper->SetSampleDistance(0.5);
	//mapper->UseJitteringOn();
	mapper->SetInputData(reader->GetOutput());
	mapper->SetGlobalIlluminationReach(0.75);
	mapper->SetVolumetricScatteringBlending(1.0);

SetGlobalIlluminationReach 控制着射向光线的次级光线的范围/范围。值0.0表示只渲染局部阴影(但它更快),值1.0表示渲染所有阴影(但它更慢)。

SetVolumetricScatteringBlending 控制散射模型混合的效果。

 效果实现:

                    25eb9a6eee244abf9b6cfbfafe1fd7d2.png

 代码:

#include <vtkNew.h>
#include <vtkNIFTIImageReader.h>
#include <vtkFixedPointVolumeRayCastMapper.h>
#include <vtkImageGaussianSmooth.h>
#include <vtkVolumeProperty.h>
#include <vtkPiecewiseFunction.h>
#include <vtkColorTransferFunction.h>
#include <vtkVolume.h>
#include <vtkRenderer.h>
#include <vtkCamera.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkGPUVolumeRayCastMapper.h>
#include <vtkPiecewiseFunction.h>
#include <vtkColorTransferFunction.h>
#include <vtkWindowToImageFilter.h>
#include <vtkLight.h>
using namespace std;

int main()
{
	vtkNew<vtkNIFTIImageReader> reader;
	reader->SetFileName(R"(./00001741.nii.gz)");
	reader->Update();

	vtkNew<vtkGPUVolumeRayCastMapper> mapper;
	mapper->SetAutoAdjustSampleDistances(0);
	mapper->SetSampleDistance(0.5);
	//mapper->UseJitteringOn();
	mapper->SetInputData(reader->GetOutput());
	mapper->SetGlobalIlluminationReach(0.75);
	mapper->SetVolumetricScatteringBlending(1.0);

	vtkNew<vtkVolume> volume;
	volume->SetMapper(mapper);


	vtkNew<vtkVolumeProperty> volumeProperty;
	volumeProperty->SetInterpolationTypeToLinear();
	volumeProperty->ShadeOn();  //打开或者关闭阴影测试
	volumeProperty->SetAmbient(0.55);
	volumeProperty->SetDiffuse(0.85);  //漫反射
	volumeProperty->SetSpecular(0.54); //镜面反射
	volumeProperty->SetSpecularPower(69); //镜面反射

	//设置不透明度
	vtkNew<vtkPiecewiseFunction> compositeOpacity;
	compositeOpacity->AddPoint(-1000, 0.00);
	compositeOpacity->AddPoint(100, 0.00);
	compositeOpacity->AddPoint(300, 0.879);
	compositeOpacity->AddPoint(478, 0.879);
	compositeOpacity->AddPoint(1500, 0.901);
	volumeProperty->SetScalarOpacity(compositeOpacity); //设置不透明度传输函数

	vtkNew<vtkColorTransferFunction> color;
	color->AddRGBPoint(-1000, 0.00, 0.00, 0.00);
	color->AddRGBPoint(100, 220/255., 21/255., 3/255.);
	color->AddRGBPoint(300, 250/255., 1.00, 189/255.);
	color->AddRGBPoint(478, 224/255., 1, 249/255.);
	color->AddRGBPoint(1500, 1, 1, 1);
	volumeProperty->SetColor(color);

	volume->SetProperty(volumeProperty);

	vtkNew<vtkRenderer>	ren;
	ren->AddActor(volume);
	ren->SetBackground(0, 0, 0);
	ren->ResetCamera();
	vtkCamera* camera = ren->GetActiveCamera();
	camera->Elevation(-70);

	ren->ClearLights();
	ren->RemoveAllLights();

	double* lightPosition = camera->GetPosition();
	double lightPositions[3] = { lightPosition[0], lightPosition[1], lightPosition[2]-100 };
	vtkNew<vtkLight> light;
	light->SetLightTypeToSceneLight();
	light->SetPosition(lightPositions);
	light->SetPositional(true);
	light->SetAmbientColor(0.3, 0.2, 0.1);
	light->SetConeAngle(60);
	light->SetFocalPoint(camera->GetFocalPoint());
	light->SetIntensity(1.2);
	ren->AddLight(light);

	vtkNew<vtkRenderWindow> renWin;
	renWin->AddRenderer(ren);

	vtkNew<vtkRenderWindowInteractor> iren;
	vtkNew<vtkInteractorStyleTrackballCamera> style;
	iren->SetRenderWindow(renWin);
	iren->SetInteractorStyle(style);
	renWin->SetSize(1024, 768);
	renWin->Render();

	iren->Start();

	return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VTK实现电影级渲染效果(CVR) 的相关文章

  • SQL Server解析Json格式数据

    主要介绍5个函数 xff1a openJson 打开Json字符串IsJson 判断一个字符串是不是合法的Json格式 是返回1 xff0c 否返回0 xff0c null返回null Json Value 从Json字符串中提取值 Jso
  • openwrt 无线桥接(AP)

    无线桥接常见的有三种模式 1 AP模式 AP模式其实是Access Point的简称 xff0c 意思是 xff1a 访问接入点 而无线网桥的AP模式 xff0c 也就是利用无线网桥做无线信号的接入点了 那么 xff0c 究竟是什么东西接入
  • macOS下使用anaconda相关系列

    创建虚拟环境 conda create n 环境名 python 61 3 6 进入虚拟环境 source bash profile source activate 环境名 其中bash profile是安装anaconda时候默认生成的环
  • Windows 安装NET4.6/4.7/4.8 时间戳签名和或证书无法验证或已损坏

    时间戳签名和或证书无法验证或已损坏 问题版本 xff1a 事件 xff1a 解决办法下载补丁程序 xff1a 安装KB2813430补丁 注意事项补丁需要重启设备生效 2021 10 11 by 崔斐然 问题 版本 xff1a win7专业
  • 在 Ubuntu Linux 中使用 PPA(完全指南)

    译 xff1a 在 Ubuntu Linux 中使用 PPA xff08 完全指南 xff09 作者 xff1a Abhishek Prakash 自由和开放源码软件的创造者 一个热心的 Linux 用户和开源推动者 从阿加莎 克里斯蒂和夏
  • RDP(远程桌面)优化

    RDP连接优化 一 优化连接时间二 优化集显帧率三 开启RemoteFX USB重定向 xff08 如果有需要 xff09 四 MacOS系统RDP超高清显示 2022 03 31 by 崔斐然 一 优化连接时间 1 客户端 xff1a 关
  • 【FRP】windowsServer部署FRP

    FRP windowsServer部署FRP 1 下载FRP nssm2 服务器端部署过程 xff1a 3 客户端部署过程 xff1a 4 卸载服务 2022 08 24 by 崔斐然 1 下载FRP nssm 下载地址 xff1a FRP
  • 【FRP】群晖docker中部署Frp

    2022 08 24 by 崔斐然 0 xff1a 需求 公司有台笔记本 xff0c 现在疫情期间居家办公 我用的MacBook RDP客户端做的非常好用 xff0c 如相互粘贴文件 文字等 xff0c MacBook通过远程桌面连接公司内
  • Debian 9/10快速开启Google BBR的方法,实现TCP高效单边加速

    BBR 是谷歌公司的某个员工研发出来的服务器单边加速算法 xff0c Linux内核从4 9版开始集成BBR算法 相比锐速BBR的加速效果更为温和 xff0c 并且占用内存小对服务器压力也很小 xff0c 当时理想情况下是可以跑满整个服务器
  • 基于机器学习的捡球机器人设计与实现(探索)第4篇——机械设计)

    2019 03 18 by 崔斐然 原以为软件很复杂 机械好搞 结果发现 都难搞 一次次想出办法又一次次被自己否定 我tm想静静
  • 人脸识别之Hog特征+SVM分类器训练与使用

    原文来自 xff1a https juejin im post 5b0e70686fb9a00a1451c8e7 计算机视觉 人脸识别 xff08 Hog特征 43 SVM分类器 xff09 一 SVM支持向量机 1 SVM原理 在机器学习
  • python利用PIL实现对图片截图

    在对图像处理时 xff0c 我们有时候需要对图片某区域进行截图 xff0c 话不多说 xff0c 直接上代码 xff1a from PIL import Image import sys 先将 input image 填充为正方形 def
  • PowerMock介绍和用法

    PowerMock PowerMock简介一 PowerMock xff1f 二 Mock底层原理1 Mockito2 PowerMock原理 三 应用场景1 依赖问题 xff0c 打桩 2 工程质量 PowerMock使用步骤一 添加依赖
  • Windows10 WSL2磁盘迁移

    一 使用 WSL 命令行工具 在 Windows 10 版本 1903 xff08 2019 年 4 月更新 xff09 或更高版本中 xff0c 您可以使用wsl exe命令行工具 1 导出分布 使用要移动的分发创建一个 tar文件wsl
  • linux下搭建confluence

    一 Java环境 java环境 二 mysql 2 1 安装前的检查和准备工作 2 1 1检查 1 是否安装过mysql xff1a rpm qa grep mysql 2 如果有的话 xff0c 就删除 xff08 XXXX是自己的mys
  • 译:SOME/IP 技术细节

    译 xff1a SOME IP 技术细节 原文 SOME IP technical details SOME IP Scalable service Oriented MiddlewarE over IP 基于 IP 可扩展面向服务中间件
  • Python requests_toolbelt的使用

    multipart form data Encoder The main attraction is a streaming multipart form data object MultipartEncoder Its API looks
  • ArchLinux中文安装教程

    以自己的电脑安装为参考 xff0c 已安装win10系统 最后效果为win10和arch双系统 xff01 xff01 xff01 一 准备工作 1 按照实际需要划分出一部分空闲磁盘空间 xff0c 右击想要安装arch的分区点击删除卷 x
  • C++20 范围库:关键优势——算法的组合

    从概念上讲 xff0c 范围 xff08 Range xff09 是一个简单的概念 xff1a 它只是一对迭代器 指向序列的开始和结束 xff08 在某些情况下是一个哨兵 xff09 然而 xff0c 这样的抽象却可以从根本上改变编写算法的
  • Drupal菜鸟笔记之使用Focal Point 模块实现图片压缩与裁剪

    在项目开发中总是有地方需要上传图片 xff0c 因此也常常需要对图片进行压缩与裁剪来达到我们想要的效果 最近项目中刚好要用到 xff0c 我就去搜索了 解了下图片的压缩与裁剪模块 xff0c 最后选择了 Focal Point Focal

随机推荐