VTK实现电影级渲染效果(CVR)
目前vtk9.2.2版本中已经集成了ray marching(光线步进)算法实现的体渲染功能,官方博客中已经介绍为电影级体渲染了,如图:
此效果是在3d显示器上的显示效果,就此效果来看说是电影级渲染效果也没什么问题,但是和光线追踪来实现的CVR还是差一些,下图为光线追踪的方法来实现的CVR。
首先可以先了解下这几个名词概念
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 控制散射模型混合的效果。
效果实现:
代码:
#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;
}
VTK实现电影级渲染效果(CVR)相关推荐
- 60FPS你有吗?现代电影级游戏效果全解析
1追本溯源,什么叫"帧"?回顶部 当看到这标题,可能你会觉得有点可笑.也许你会想,现在游戏流畅度不是以平均帧数30为标准的吗?当一款游戏的平均帧数超越30FPS,这款游戏可以算是流 ...
- 【原创】点点鼠标在Unity3D中实现准电影级镜头感渲染效果
学习和使用Unity3D也有个把月的时间了,得益于十多年来对3D图形算法及游戏编程的不懈努力学习,上手Unity3D我居然只用了1晚的时间,这不是夸张的说法.我只能用一句话来形容我当时的感觉:众里寻他 ...
- 利用PHOTOSHOP实现电影级视频实时滤镜渲染效果
(1)问题的提出: 对于摄影师来说,一幅作品的好坏取决于拍摄 + 后期,随着计算机视频技术的飞速发 展,后期处理越发重要.然而对于一部视频的后期处理是非常复杂且专业和耗费资金设备及时间精力的事情.本文 ...
- python 动画场景_clarisse电影级CG场景渲染中文教学
clarisse电影级CG场景渲染中文教学 clarisse电影级CG场景渲染中文教学 clarisse电影级CG场景渲染中文教学 clarisse电影级CG场景渲染中文教学 clarisse电影级C ...
- 华为Mate 30系列发布:电影级4摄,麒麟990 5G,没谷歌全家桶,售价高于iPhone11
鱼羊 发自 凹非寺 量子位 报道 | 公众号 QbitAI 昨晚,华为在德国慕尼黑发布了年度旗舰Mate 30系列.同时,今天iPhone 11系列也正式开始发售,双方对决意味明显. 同样是主打拍照概 ...
- 电影级视觉特效插件:Red Giant VFX Suite for mac
VFX Suite破解为After Effects中的逼真视觉效果复合提供了强大的工具包.使用Supercomp,光和大气效果可以以比使用简单的2D图层堆栈建模更自然的方式与所有图层和场景元素进行交互 ...
- 电影级动态图片制作PS动作
人来人往,车来车去,熙熙攘攘的繁华城市中,我们总会看到一些秀丽名城 建筑精巧的动态事物.可是一眼而过瞬间成为了过去,今天我们只要用这个PS动作就可以轻轻松松把拍摄的视频文件制作出电影级的动态GIF图片 ...
- 451+Sony索尼Slog2和Slog3灰片视频电影级调色LUT预设 Slog2 Slog3调色LUTs预设
451+Sony索尼Slog2和Slog3灰片视频电影级调色LUT预设 Slog2 & Slog3调色LUTs预设 原文及下载地址:https://www.aeziyuan.com/t-195 ...
- Emotivecolor GHAlex Daylight for Mac(LUT电影级色彩预设)
本次小编为您带来了Emotivecolor GHAlex Daylight for Mac,这是一套适用于Premiere CC,Photoshop,达芬奇,FCPX等软件的LUT电影级色彩预设.GH ...
最新文章
- 生成keystore是报错拒绝访问(已测试)
- Oracle Execute Plan原理分析与实例分享之一
- 从命令行运行 MyBatis Generator
- crtmpserver流媒体服务器的介绍与搭建
- 由浅入深剖析go channel
- Ubuntu16.04 开启多个终端,一个终端多个小窗口
- 常用的表单正则表达式
- java未知变量的类型_Java语言中类、变量及方法的声明 | 学步园
- PowerEdge r730xd 安装centos 6.7
- JavaScript 操作剪贴板
- 武春岭 《C语言程序设计》教案PPT,重庆出版社出版,李勇主编的大一C语言课程ppt第1章.ppt...
- 2021年软考DHCP技术点+配置
- Fiddler配置https
- 记一次设置密钥登陆centos7所遇问题
- Mysql中将查询出来的多列的值用逗号拼接
- UDP SOCKET 两台电脑通信
- idea更新git报错master has no tracked branch
- 计算机桌面保护时间,请教一个屏幕保护的问题,域内的计算机可以设置不同时间的屏幕保护策略吗?...
- 上行下行带宽什么意思?代表了什么看完你就能懂
- java高并发解决方案
热门文章
- Android-系统服务-settings
- ip地址、网络地址、网关、域名
- 学术报告系列(八) - Fault-tolerant control of unmanned aerial vehicles
- 2023年最值得关注的十大科技趋势,这些技术将迎来爆发,把握住风口和掘金机会!
- OSI七层协议和Tcp/IP五层协议,路由器交换机和HUB的区别
- Java学习路线·入门
- Linux 下的DNW
- 任正非自罚100万:“不要脸”的人,有多可怕?
- 怎么在电脑上用计算机,如何把旧电脑变成云电脑?戳这里
- 什么是SQL注入式攻击 如何防范