对于体模型来说,很多光学效应都很难实时生成。它们可能对渲染时间有重要影响,或者它们需要预先计算,阻止了以交互方式更改传递函数,因为它决定了遮挡。

本文提出了两种在体模型上快速生成环境遮挡的方法:

  • 第一种是屏幕空间方法,它不需要任何预先计算的数据结构。
  • 第二种方法是独立于视图的方法,它以密度值的总面积表的形式存储体信息,因此,允许按需交互改变传递函数,但是要以牺牲内存空间为代价。

尽管这两种方法都能获得相似的质量结果,但是3D版本更适合于具有不连续结构的对象,如血管或肠道,并且它可以产生更好的帧速率。屏幕空间版本更适合于有限的GPU内存环境,因为它不需要额外的3D纹理存储。作为一个额外的结果,我们的屏幕空间技术还允许使用相同的数据结构计算视图相关的、可交互配置的光晕(halos)。

  • 邻近遮挡图(VOM):一种动态计算的数据结构,其主要优点是:(i)无需预计算;(ii)对渲染的影响有限(即每帧常数);以及(iii)可用于计算依赖于视图的实时光晕(大小或颜色可以交互更改)。
  • 密度求和面积表(DSAT3D):模型密度值的三维总面积表,允许快速计算环境光遮挡。它的主要特点是:(i)独立于视图的环境光遮挡计算;(ii)对渲染性能几乎没有影响;(iii)需要预先计算3D纹理,代价是相应的内存占用。

这两种技术的视觉质量是相似的,除了结构的深度变化出现大。在这些情况下,vom可能会生成过冲区域,DSAT3D可能更合适。

区域求和表就是从(0,0)一直求和到当前点(x,y)的表:

,它提供了一种在固定时间内计算图像中任意大的矩形区域内值的方法。为了计算t的矩形区域的值之和,只需要四次访问

体模型的环境光遮挡为邻近着色。这项技术是专门为提高体模型的深度感知而设计的。最初的想法来自于一种称为暗斑的全球照明的快速估计方法。对于一个曲面点,该算法通过测量点附近的遮挡情况来衰减来自空间中各个方向的光照。为了做到这一点,遮挡是通过采样要着色的体素的环境超过1000个采样方向来计算的。虽然所开发的算法可以有效地跟踪光线,但是采样如此多的方向会对渲染时间产生重要影响。最近的论文讨论了基于环境光遮挡的实时阴影生成。不幸的是,他们中的大多数要么需要一套预先计算的结构,要么需要三维几何知识。我们的方法不需要预计算,也不需要几何知识,这在体绘制中通常是不可用的。请注意,在体绘制中,着色取决于传递函数,因为该函数确定遮挡,并且可以交互更改。

临近遮蔽表——生成环境光遮蔽和光晕

开发了一种新的数据结构,称为邻近遮挡图。

给定一个体对象的渲染图像及其相关的深度贴图,我们可以通过分析给定像素的周围像素的深度值,并计算深度比要着色的像素小(它们更接近于观察者)的像素数,从而对该值进行环境光遮挡。一般的方法来计算深度贴图中的元素数会导致纹理查询数量过多,从而降低帧速率。Crytek开发的解决方案包括使用特定模式对该区域进行二次采样。这样的采样会导致视觉噪声伪影,这些伪影可以通过滤波来减少。我们采用了一种完全不同的方法:我们使用一种新的数据结构VOM来计算平均深度。

VOM把深度映射编码到两个表中,一个包含单个像素临近区域的积累深度,另一个包含对总和有贡献的值的数量。从视点通过光线投射得到的深度图来构建vom。对于每个片段,深度贴图包含光线不透明度达到1时到观察者的距离。我们的数据结构是通过处理深度图并生成其区域求和表以及有关有效地促成总和的片段数的信息而构建的。因此,vom由两个表组成,分别称为SATdepth(深度映射的区域求和表)和SATNdepth(位图的区域求和表,其中1表示不属于背景的像素,否则为0)。

系统的执行分为两步:第一步RayCasting,生成颜色映射和深度映射该映射传入CPU,用来构建VOM表。第二步,把VOM传入GPU,简单地光栅化屏幕对齐四边形,使用VOM来产生最终的结果。

我们使用VOM近似遮挡,然后使用以下公式将关注点周围的平均深度近似为:

其中sizex和sizey表示的是深度映射的2D区域的分辨率。

平均深度只能用SATdeph来计算。然而,尽管这可能会产生可接受的结果,但考虑到对平均深度有贡献的像素数量,会产生更精确的值,这是通过SATN实现的。最后,我们利用点的平均深度和当前深度之间的差值来进行着色,以获得接近体素覆盖的半球百分比的更好近似值。根据该值,我们可以有效地推断由点周围不透明体素生成的遮挡量。这可以解释为通过仅取一层位于观察方向的阻挡器(深度图)来近似周围的环境光遮蔽效果。

我们可以建立一个变暗函数,添加到Phong着色函数中,将生成深度线索,提供更好的理解渲染模型。该函数在着色器中实现,并对深度与1.0不同的所有片段(即属于对象最终颜色的片段)执行。它是通过从光线跟踪过程(RCcolor)生成的颜色中减去一定量的邻近颜色的暗度值来修改的,因此片段的颜色将是:,如果这个vicinitycolor是白色,就仅仅是让周围变暗,但如果是其他颜色,就能给选择的结构上色来突出它。

环境遮蔽项:,然后

图a表示没有遮蔽项,图b表示有遮蔽项。

区域求和表会因为位深而变大,在分辨率为wXh的SAT表中,存储每个组件的位的数量为,其中Pi是输入精度。(这我就不知道为啥了)

如果处理不准确,这可能会溢出纹理分辨率。在我们的例子中,我们以长整数格式执行SAT计算,然后将结果转换成一对32位的纹理到GPU(一个用于深度和,另一个用于不同于0的元素的累积数量)。avgdepth计算需要对深度进行四次访问,并且对于促成深度映射的像素数量(就是用上面所述的都是0或1的数生成的SATN表)需要另外四次访问。我们可以将这两个表编码到一个64位纹理中,从而节省四个纹理访问。然而,这些优化大多影响不大,因为我们的算法产生的主要成本是数据传输,稍后将对其进行分析。

为了在模型的选定部分渲染光晕,我们执行了一个类似于模拟邻近着色的算法。在这种情况下,我们必须考虑到光环必须围绕感兴趣的对象进行渲染,并且必须在离开对象时衰减。

用户可以通过操纵滑块来决定光晕扩展(以像素为单位)。此外,用户还可以交互地改变光晕颜色。为了渲染光晕,对于每个像素,我们查询VOM来计算邻域的平均深度,并且,如果当前片段在对象之外(这可以通过查询深度贴图来确定),我们使用以下公式渲染颜色晕,该光晕随到对象的距离而衰减:

其中,RCcolor是光线投射算法生成的颜色,光晕导致的变暗量(darkh)由以下公式确定:

 ,halo w表示的是权重,Num Elems表示对平均深度计算有贡献的元素数量,resolution是感兴趣区域的大小。将深度不为零的碎片数量除以搜索区域的分辨率,我们创建了一个函数,该函数随到目标的距离而衰减。

其结果是使用用户选择的颜色绘制光晕,其强度和影响区域可以交互更改。所有这些更改都是可能的,因为执行效果所需的纹理访问数是恒定的。下图示出了使用该技术生成的晕的两个示例:

注意左图的光晕是黄色的,右图是蓝色的。

我们的应用程序允许从一组先前分段的结构中交互式选择结构,阴影效果仅限于这些结构。这使我们可以为模型的指定部分创建光晕或着色,以便更好地了解感兴趣的结构。下图说明了这种效应,将肝脏中的血管树与周围的结构分开。

渲染需要一些更改:当生成彩色图像和深度贴图时,光线投射器会为每个不透明度为1.0的渲染片段识别其所属的结构,并对标识符的三维纹理进行额外提取。这将产生一个修改后的深度贴图,该贴图只存储感兴趣结构的深度值。但是,我们将光线到达的深度存储在颜色贴图的alpha通道中(即使它没有与感兴趣的结构相交)。这样,我们可以比较所选结构的深度贴图和颜色缓冲区的深度。因此,当评估像素是否必须使用光晕颜色进行着色时,我们可以测试它前面是否有遮挡对象,并避免在那里绘制光晕。上图展示了这种效果。请注意,我们要高亮显示的血管前面的一些色带确实正确地遮挡了光环。使用“结构选择”(structure selection),我们还可以围绕半透明结构或位于半透明体积内的选定结构渲染光晕。

使用密度区域求和表和环境光遮蔽

上面的算法中,产生的SAT表信息依赖于视图。因此,它不考虑着色点周围的体,而只考虑数据集在视图方向上的二维投影。实际结果是,非不透明区域不会对着色产生影响,因为深度贴图是在相交光线达到总不透明度的距离处构建的。更现实的方法应该考虑到这些信息。Ruiz等人通过追踪各个方向的光线来探索一个点的周围环境。不过,我们要避免光线跟踪,因为过于耗费时间。

如前所述,我们将构建一个区域求和表的3D版本。三维区域求和表以前用于重要信息存储。在我们的例子中,我们对数据集的密度值进行编码。三维总面积表的构造类似于二维版本。也可以递增地进行,如下图所示。为了使用DSAT3D计算一个区域的平均密度,我们需要八个纹理访问(与2dSAT所需的四个查询相比)。因此,立方区域的平均密度计算为D¼(V1 V2 V3+V4 V5+V6+V7 V8)/Nvox,其中Nvox是所分析区域中的体素数。

表示分析的区域的体素数量。

为了模拟某个点上的环境光遮挡,我们评估围绕该点的体素的不透明度。我们可以采样每个相邻体素的密度,通过应用传递函数来确定其不透明度,并据此减少光照。然而,就像在2D版本中一样,这将产生过多的纹理读取。相反,我们所做的是使用DSAT3D来计算该区域的平均密度值,这种简单的方法是计算感兴趣点周围立方区域的平均密度D。然而,将D作为平均密度并应用传递函数来估计遮挡将引入一个误差,如果密度值在其中发生较大变化,则误差可能会变得过大。如果平均数考虑了大量体素的话误差更是会很大。只需稍加努力,我们可以将遮挡评估为感兴趣点周围八个立方区域引起的遮挡的总和,如下图所示。这为闭合结构提供了一个更好的近似值。请注意,这不仅是作为平均密度的一个更好的近似值,而且遮挡是根据感兴趣点计算的8次。如果我们对密度取平均值,遮挡值可能与遮挡非常不同。

,Di表示区域求和表的平均密度,平方根的作用就是为了增加平均密度比较低的值,同时阻止最大密度为1。

如果我们使用了一个大的查询区域,那么使用八分之一而不是整体平均值是不够精确的。但是,对于我们使用的距离要着色的点10到20 体素的范围,效果是一个很好的近似值。如果需要更高的精度,我们可以使用多分辨率方法,一组接近感兴趣点的近八分之一组,权重更大,而另一组面积更大、权重更低。使用以下函数计算变暗值:

这有助于用户微调所需的变暗量。最后,通过计算与前面方法相同的函数来计算得到的颜色。

参考文献:

《Real-Time Ambient Occlusion and Halos with Summed Area Tables》

《Vicinity Occlusion Maps - Enhanced depth perception of volumetric models》

基于区域求和表的实时体渲染环境光遮蔽和光晕技术相关推荐

  1. MXNet的Faster R-CNN(基于区域提议网络的实时目标检测)《9》

    MXNet的Faster R-CNN(基于区域提议网络的实时目标检测)<1>:论文源地址,克隆MXNet版本的源码,安装环境与测试,以及对下载的源码的每个目录做什么用的,做个解释. MXN ...

  2. 全局体渲染光照技术总结概括(截止到2014年)

    我打算尽可能详细整理一下体渲染的光照算法,从一篇比较详细的综述入手,里面的内容会根据需要进行展开. 目录 目录 1-材料散射 2-算法的分类 3-算法描述 3-1-基于局部区域的技术 3-1-1 基于 ...

  3. 实时云渲染有哪些优势?

    随着元宇宙的兴起,作为六大核心技术之一的实时云渲染技术引发了剧烈的讨论.很多还在使用传统实时渲染的小伙伴们就有点蠢蠢欲动,试了到底是不是真的好用?每当新事物出现时,总有人会迟疑,但是越是迟疑越可能赶不 ...

  4. 实时体积云渲染(地平线):三.云体渲染

    实时体积云渲染(地平线):三.云体渲染 体渲染 最常见的体可视化方法就是Ray-marching法.该方法如下图: 在像云这样的部分透明的介质的情况下,采样点将沿着视线进一步增加到场景中,并增加固定的 ...

  5. ECCV2022 | 开源:基于可分离级联查找表的实时图像增强方法

    近日,阿里巴巴大淘宝音视频算法与基础技术团队和上海交通大学图像所合作论文<SepLUT: Separable Lookup Tables for Real-time Image Enhancem ...

  6. 计算机树表查找算法的适用场景,利用基于R-树连续最近邻查询算法来渲染雨滴,形成了逼真的下雨天场景图...

    摘要:自动驾驶领域最近的发展表明,这些车辆在不久的将来会出现在每个城市的街道上,而这些城市不会容忍交通事故的发生.为了保证安全需求,自动驾驶汽车和被使用的软件必须在尽可能多的条件下进行详尽的测试.通常 ...

  7. 基于物理的渲染—基于球面调和基的实时全局光照明

    在介绍本文的主要内容PRT之前,我们先介绍在游戏引擎渲染管线中常见的一个步骤 IBL.迪士尼在2012年Siggraph会议上发表的 PBR course中提到,他们在 PBR 的渲染管线中加入了 I ...

  8. [译]基于GPU的体渲染高级技术之raycasting算法

    [译]基于GPU的体渲染高级技术之raycasting算法 PS:我决定翻译一下<Advanced Illumination Techniques for GPU-Based Volume Ra ...

  9. 【计算机图形学】基于GPU预计算的大气层光效渲染

    基于GPU预计算的大气层光效渲染 前言 大气物理模型 渲染方程及其实现 实验结果 参考文献 前言 本文叙述基于物理模型的大气层光效渲染,不仅考虑单重散射,而且也尝试实现多重散射的效果.主要参考论文为E ...

最新文章

  1. 北大女生拿下阿里数学预赛第一名!决赛入围率不到1%,最小晋级选手只有14岁...
  2. css基础选择器教程,CSS核心基础 一些常见的选择器的使用 小白教程
  3. K Balanced Teams
  4. mysql count(*),count(1)与count(column)区别
  5. deepin安装java_Deepin安装Eclipse
  6. git代码托管 · 操作举例: “git bash here ”(全程操作讲解) - git命令篇
  7. 数组的循环移位c语言,如何将一个数组的元素循环左移?
  8. windows、ubuntu、Red Hat、Solaris 单网卡绑定多个IP
  9. java给byte赋值_关于JAVA中Byte数据类型二进制赋值运算报错问题
  10. LINUX下载编译jpeglib
  11. 七月算法机器学习5 回归分析与工程应用
  12. 过滤钩子驱动程序一(微软DDK文档,FLASHSKY翻译)
  13. android图片浮动层,android浮层图片拖动并且可点击效果
  14. 小程序下找地点、查路线、搜地铁,用这3个插件就够了!
  15. web自动化你需要知道的
  16. 游戏开发unity编辑器扩展知识系列:进度条显示EditorUtility.ProgressBar
  17. python怎么播放视频教程_python怎样播放视频?
  18. Win11游戏模式怎么开启?Win11开启游戏模式的方法
  19. 螺旋图形Linux,一个实例带你熟练使用UG中的螺旋线,新手必备!
  20. iOS微信聊天界面朋友圈多个小视频同时播放不卡顿

热门文章

  1. ToB创业,要借什么势?
  2. shell 编程 declare 命令
  3. linux 环境安装配置,Linux相关环境安装与配置
  4. ubuntu14.04安装360wifi2驱动
  5. Python编程:从入门到实践 9-6~9-8
  6. php - 基于 webuploader 视频大文件分片分段上传,支持断点续传(刷新、关闭页面、重新上传、网络中断等情况)带进度条,前端后端都有示例源码详细教程
  7. 【读书笔记】动机与人格
  8. 转转大师免费删除PDF文件密码
  9. D16 HBase数据模型/命令行/存储机制
  10. unbound:安装与配置