V-Ray DMC采样器原理释疑

译/韩世麟

本文是戴巍老师在他的博客“戴老师的渲染作坊”中提到的关于V-Ray DMC采样器原理的技术帖。英文原文来自于interstation3d.com。同时还有一位台湾同胞早已翻译过繁体中文的版本(需VPN),我个人出于学习研究的目的,想要基于英文版再次将其翻译成简体中文的文章,希望能够更易读一些,同时翻译的过程,也是精读文章的过程。

前言

在这篇教程中,我会为大家介绍DMC采样器的基本原理,但在这之前,我们先来梳理一下V-Ray中的另一个图像采样器:自适应细分。我不会讲解固定比率采样器,因为它非常容易理解,即使你暂时不理解,你也可以在阅读本文之后顺便就掌握它了。自适应细分是一个几乎所有其他“有偏差的非物理渲染器”(注1)都在采用的算法。它是一种相对来说有点老式,但在绝大多数情形下都非常好用的算法。它会算出干净且采样细致的图像结果,在静帧渲染时的表现非常出色,但是与DMC采样器相比,自适应细分往往会在一些本可以采样再少一点的地方过多采样,相比之下,如果你用DMC采样器,那么要在某些同样的地方求出同样质量的反射模糊可能就不用这么多样本。上文提过了,细分算法是大多数和V-Ray有一拼的“非物理渲染器”都在采用的采样算法,但是我发现,似乎上述这些渲染器在看到V-Ray用户良好的使用体验之后,都纷纷转而开发一些非常近似DMC算法的采样算法。我知道有一款渲染器,就在使用和DMC算法非常类似的算法,而且它和V-Ray一并的,都因为开发出了这种算法而越来越被高端产品渲染所青睐。DMC是目前在求取镜头景深和三维运动模糊时最好用(时间短质量高)的光线追踪采样算法。

详解“采样”,自适应采样

所有非物理渲染器的共同点是它们的算法几乎都是自适应性的。自适应性是什么意思?为了暂时简化问题,我们举一个3×3像素点阵的例子。当你点下“渲染”按钮以后,Vray,或者其他渲染器,会投射出9个初始采样样本,这意味着每一个像素会得到一个样本,现在我们暂时假设采样点会位于每个像素的中心点上。


3×3的初始采样
每像素1个初始采样点

如果你对“光线追踪”的原理还不是很了解,这里我们就来快速的讲解一遍,很简单。想象你现在有一个摄像机,摄像机镜头前挡着一个代表了图像分辨率的网格(本例中是3×3的九宫格)。然后镜头前还有被摄物体。当Vray开始渲染的时候,它会由镜头中心点打出若干条射线,穿过每一个像素(每个正方形的网格)的中心,最后打在最近的模型表面上。这条射线实际上是由摄像机发出的,一直向前延伸,直到它打到了被摄物体而停止(这条射线被称作“嗅探光线”,eye ray)。嗅探光线打到物体上的点就是它与被摄物体表面相交的点。那么在这个点上,渲染器就会开始收集并计算处在这个空间中的这个物体上的这个点的所有的着色的信息(它是反射的还是折射的?它是什么颜色?它被光照亮以后应该是什么颜色?它是在阴影里还是直接被光照?),然后它就会把计算结果反馈给Vray,说这就是这个空间点的着色信息,那么这整个像素就应该是这个颜色。从摄像机投射出的光线被称为“嗅探光线”或者“首次光线”,所有其他由材质表面发出的用来采集直接光照,GI(反弹光),反射等信息的光线,都被称为“二次光线”。请牢记这一点,因为我们会在本教程中同时提到这两种“光线”。下面我们用简图来进一步加深对光线追踪的理解。

同样的过程在这9个像素中逐一运算一遍,你基本上就得到了最终的图像。那么这里的漏洞就在于每个像素的着色仅仅只依据一个样本,而这个样本的颜色仅仅是空间中的一个理论上无限小的点的颜色,也就是嗅探光线和模型表面的交点。在现实世界中,如果你在摄像机面前划分像素网格,那么每一个网格的颜色是穿过这个网格的无数条光线的平均色。在渲染软件中显然这是不可能的,你不可能射出无数条采样光线,计算机不可能无限制的计算下去。软件开发者想出了一些很聪明的办法,让计算机自己判断出在有必要的时候,才增加对个别像素的采样。这就是自适应采样技术,因为采样的数目是依据图像的复杂程度而适应性变化的。那么在颜色对比比较明显的地方采样数量会增加,举个例子来说,在色彩对比较强烈的区域,渲染器会每个像素分配25个采样点,而在空旷平坦的区域则仅仅会分配1个采样点,不会在这种像素上浪费更多采样的时间。


初始采样后
渲染器会得到该像素的颜色值

渲染器依照颜色阈值判定像素色差大小
进而会在部分像素上分配更多的采样点
像素颜色会被进一步更新

下面几幅图显示了自适应算法的优越性:第一幅图是每像素仅有1样本的结果,第二幅图是每个像素都有100个样本,第三幅图是使用了自适应技术,每个像素最少有1个样本,最多有100个样本。你可以很明显的看出来使用固定比率采样浪费了很多时间,自适应采样比固定比率要快得多,而且图像质量几乎是一样的。


固定比率采样
每像素1采样点
渲染时间:1.9秒

固定比率采样
每像素100采样点
渲染时间:2分55秒

自适应采样
最少1采样点,最多100采样点
渲染时间:1分1秒

自适应细分和DMC采样的共同点是它们都是自适应性的采样算法,但是工作机制不同。我们先从自适细分讲起,因为这是最老牌的算法,多了解一下没坏处。而且如果你不事先掌握自适应细分的工作原理,我恐怕也很难给你讲清楚DMC算法的优越之处。

细分采样器

在上文讲解采样这个概念时,我说初始采样是穿过像素中心点的。但其实细分采样器不是这样工作的,细分算法的采样点是处于如图所示的像素顶角上:


细分采样器会把初始样本
放置在像素网格的交点上

初始样本采集到信息以后,细分采样器会分析这些信息,然后来决定哪些像素需要更多的采样样本。每一个像素边角上的样本都被拿来比较,如果某个像素的色差大于参数面板中设定的颜色阈值(下图所示),Vray就会进一步细分这个像素,并且在这个像素上采集更多的样本。


基于在参数面板中设定的颜色阈值,Vray会根据由像素边角处采集的样本
判断像素颜色是否高于颜色阈值,如果是,就会在像素内部采集更多的样本
如果否,采样就会终止,像素的颜色就被决定下来了。
例一

初始样本被定位在了像素的边缘
Vray采集了初步的色彩信息
第一个的像素的颜色和第二个很接近
因为色差小于参数设定的颜色阈值
渲染器就会判定没有必要对这两个像素
增加更多的进一步采样。
例二

两个像素的色差非常大,超过了颜色阈值
意味着渲染器会在这两个像素中采更多的样本
样本上限由参数面板中的最大比率决定
最大比率2意味着每个像素一共最多采16个样本
(这16个样本包含第一轮的1个初始样本)

这样的过程会一遍遍重复直到颜色阈值达标或者采样数达到了每像素允许采样的最大值。要记住,最大比率可不是每像素的最大样本数,而是这一个像素会被十字切分多少次,那就是0=1个样本每像素,1=4个样本每像素,2=16个样本每像素,3=64个样本每像素。你还要意识到有些样本是像素间共享的(像素边界上的那些),所以如果你设置最大比率为2,那么在计算像素颜色的时候最多每个像素可以用到25个样本,9个是这个像素独享的,另外有16个是在边缘上和其他像素共享的。最大比率1的时候则是中心有一个样本是独享的,周边另有8个是和其他像素共享的。下图是更直观的解释:


自适应细分采样器
有些像素采样多,有些像素采样少
一切都根据边角和中心的样本色差来决定
图示案例的最小比率是0,最大比率是2
意味着初始样本是每像素分配1个采样样本
但是因为样本是采在边角上,所以每个样本都是被共用的
然后根据色差,每个像素的采样至多会达到16个。

现在最大的问题是,细分采样器在做判断的时候依据的只能是这个像素边缘处采集的信息。它几乎完全不知道周围的像素到底是什么颜色,它仅仅知道周围的像素边角处是什么颜色。这种判断方式在某些场景是没问题的,但是在场景里有很多细小的物体或者是有精度非常高的贴图的时候,仅仅从像素边缘采集样本是远远不够的。我们在决定是否对一个像素进行进一步采样的时候,最理想的依据就是周围像素的具体颜色值。这恰恰就是DMC采样器的判断标准,因此在(例如)一些非常精细并且有很多细线的场景中,DMC在判断是否对像素进一步采样方面,它的表现要好太多,特别是当我们在渲染动画的时候,DMC采样的结果会更干净,闪烁更少,不会有帧与帧之间的突变现象。下图展示了这一点:


判断是否进一步采样
的依据是这个像素本身边缘处的信息
这是自适应细分采样器的思维方式
并且会在面对精细场景时出现问题
在这种场景中,依据周边像素实际的颜色进行判断
会更加高效,且图片质量会更高

自适应细分采样器
在场景中有很多细线条时会力不从心
在这个简单的案例中你可以看到非常多的断线
采样器没有在需要采样的地方采集足够的样本
这都是因为细分采样器在进行采样判断的时候
依据的是像素边缘处的信息。在这个案例中
我把颜色阈值设为0.01,最小比率设为0,代表
初始采样是每像素1个样本,最大比率设为了3
代表如果有必要,它会三度十字切分像素
每像素最多可采64个样本,想渲染出流畅的线条
每像素64个样本绝对够了,但是渲染器没法通过
每像素1样本的初始采样得到足够的反馈信息

DMC采样器
不会产生类似的问题,因为它在做判断时
依据的是被采样像素周边所有像素的实际颜色
这样一来它就能够察觉到细线的走向,并且
非常高效的采集细节的信息,不会产生缺陷
本例中,DMC采样器的最小细分设为1
最大细分设为8,意味着初始采样还是每像素1样本
而如果有必要则每像素最多可采64个样本
颜色阈值和自适应细分一样,也是设为了0.01

在使用自适应细分采样器的时候,为了得到干净的结果,场景中几乎所有的地方都会某种程度上的被过度采样,比如当初始采样遇到反射模糊,折射模糊,brute force GI,景深和运动模糊时,渲染器几乎都会以参数设定的最大值来采样,然后所有的信息被加在一起求平均色,然后这个颜色被拿来和周边比较,最后得出需要进一步采样的结论。意思是比如你设定用20个样本求景深,10个样本求运动模糊,100个样本用来求反射模糊,那就很可能你每一个像素都要事先采集极多的信息。这样的确可以求出非常干净平滑的结果,但是代价是极长的渲染时间,因为你每增加一个初始采样样本,那么计算机就要采集后续的一整套景深,运动模糊,反射模糊样本,但其实很多时候你根本没必要在一个像素上采这么多的二次光线(反射,折射,阴影等),就可以得到很好的结果了。这时候,像DMC这样基于像素内部采样的算法就大显神通了,它们会控制所有需要进一步采样的像素(比如反射模糊)的采样数量。

在我们进入DMC采样器案例之前,我们先来讲解一下全局DMC采样器的选项卡,以及其中每个参数的意义。要知道这套参数不只在DMC采样器激活时起作用,你用固定比率采样器的时候,用的也是这个算法。自适应细分采样器和前两者不同的地方在于,自适应细分的初始采样(嗅探光线采样)过程和后续的材质二次光线采样(反射模糊之类)过程是截然分开的,而在DMC采样器中,初始采样和二次采样的总数量受这个参数面板的控制(图像采样和其他材质细分采样全部加在一起)。

全局DMC采样器选项

我们来一个个的解释这些参数。你也可以去看Vray帮助文档,但是这段文字应该比帮助文档好理解。这里我将假设一种情形,就是当初始采样光线穿过像素网格打到模糊反射的材质表面的时候,有若干条反射模糊光线要射向四面八方的情况。明确一点这里的案例是极端情况,以便于你看到明显的结果,但是在项目实践中,改变这些参数的影响效果可能会比案例中要小。

自适应程度(Adaptive amount):举例,如果你的反射模糊材质表面每个点最多会发出100条二次光线来采集模糊样本(材质反射模糊细分设置为10),那么把自适应程度设置成0.5就意味着Vray会先从这个点散发出50条(100的50%)二次光线样本进行初始采集,然后再来判定这个像素是否需要进一步采样,需要多少进一步采样。事实上,在这50个初始样本以后,后加的样本是一个个增加的,每次新增一个样本,Vray都会把它和已有的样本进行比对。如果新样本所带来的变化非常微小,进一步采样就会停止,因为继续采样下去的意义已经不大了。如果自适应程度设成0.7,那么初始采样会打出100个样本中的30%,0代表打出全部100个样本,而1(自适应程度100%)则会发射出最少样本(Min Samples)参数栏设定的下限值,然后再进入自适应判断,只在需要的地方增加采样来计算最终的反射模糊。最后一种情况中的最少样本参数是作为保险措施的,因为如果自适应程度设成了1,那Vray很难仅凭2个初始样本就决定这个反射模糊像素是不是需要进一步采样。那么在最少样本这一栏,你要确保不管你在自适应数量中输入了多少,最少样本的参数应该是8,接下来才是自适应判断。


自适应程度 0
在嗅探光线和模型的交点上,全部材质表面的反射模糊样本都会被收集

自适应程度 0.5
初始采样会先收集材质最大细分的50%的样本,然后进入自适应采样阶段,当像素颜色满足噪波阈值时,采样会停下来

自适应程度 1
当自适应程度设置为1时,最少样本参数被激活,意味着材质表面最少会发出8条光线来采集模糊信息,然后进入自适应阶段,直到像素颜色满足噪波阈值

还记得开篇的“光线追踪”的示意图吧,我们从另外一个层面再来看一遍这个原理:

噪波阈值(Noise threshold):举例,如果自适应数量设为了0.5,又假设场景中的反射模糊最多每个采样点采100个样本(反射细分为10),Vray会第一批投射出50个反射模糊采样样本,在这之后依据这个噪波阈值来进行自适应性采样。意思是在这50个初始样本以后,每增加一个样本都会和这50个样本计算平均色,来检查这个新样本带来的颜色变化是不是大于噪波阈值,如果真的大于,就会继续发出采样样本,直到颜色变化小于噪波阈值。如果颜色变化很小,小于了噪波阈值,Vray就会停止反射光线样本的采集,并且终止该材质的反射模糊计算。以下是一些范例,你可以看到这个数值对反射模糊质量的影响。这是个非常重要的参数,最终正式图中,这个值的范围应该在0.005-0.01之间。


噪波阈值 0.01

噪波阈值 0.1

噪波阈值 1.0

最少样本(Min Samples):如果自适应程度设成了1(100%自适应),那么即使反射模糊的采样上限是100,Vray最初也仅仅只会打出一两个反射光线样本,然而这点样本是绝对不足以让软件判断该像素是否需要进一步采样的。为了防止这种情况,最少样本数就是进入自适应采样前,初始采样数目的下限值。Vray在进入自适应计算前,会对每一个模糊像素采至少8个样本。


最少样本 50

最少样本 8

最少样本 2

全局细分倍增(Global Subdivs Multiplier):这是全场景中所有需要细分采样的参数的倍增器。比如说灯光阴影的虚边,反射和折射的模糊,运动模糊,景深模糊等等。举例来说,如果你材质的反射模糊细分是10,全局细分倍增是2,那么在材质面板里的细分值实际上会变成20(10×2)。如果全局细分倍增是0.2,那么反射模糊的细分实际上就会变成2。改变这个值肯定能让画面变得更平滑,但是代价就是相应的渲染时间。一定要明白,全局中凡是“细分”参数都会被它影响,我建议你当个别材质效果不理想时,一定去单独调试个别的材质,千万别图省事修改全局细分倍增。


全局细分倍增 10

全局细分倍增 1

全局细分倍增 0.1

欢迎来到DMC的世界

根据我们目前掌握的知识,理解DMC的工作原理已经不是那么困难了。我们要了解的第一个事实,同时也是DMC最重要的特点就是:在决定一个像素是否需要进一步采样的时候,这个像素周边所有像素的颜色信息都被拿来进行考量。这种算法的结果我们已经在线框茶壶的案例中展示过了,这里我们用另一种方式展示一下。


自适应细分采样器
细分采样器在决定像素是否
需要采样的时候
仅考虑像素边缘的信息

DMC采样器
DMC采样在决定是否进一步采样时
依据的是目标像素像素周边的
所有像素的实际颜色值

也许这两种算法看起来没太大区别,但是其实区别巨大,因为后者真的可以捕捉到场景中所有微小的细节。和在像素边缘采集初始样本的细分采样器不同,DMC采样器会在每个像素内部的随机点上取第一个初始采样,而且如果它决定对一个像素进一步采样了,那么他也不会像细分采样器那样用均分网格划分像素面积,进一步的采样也可以认为是完全随机的。尽管确定性蒙塔卡罗(DMC是Deterministic Monte Carlo的缩写,即确定性蒙特卡洛算法)的这个“确定性”意味着采样确实会形成某种模式,但是这个确定性蒙特卡洛算法实际上是为了比Vray早期的准蒙特卡洛(QMC)算法重复率更小才引入的。

人们总是不明白为什么DMC采样器在处理运动模糊和景深的时候比自适应细分快这么多。其实原因就在于DMC采样器参数控制着所有需要进一步采样的像素的样本数,通过这个方式我们可以确保每一个像素都是用最少的样本就可以达标,绝对不会浪费时间在那些对最终图面影响微乎其微的像素上面。

具体到技术上来说,DMC采样器会用全局中所有的细分数值(材质,灯光等等)来除以参数面板中最大细分一栏的数值这种情况不会在自适应细分采样器中发生,这也是这两种采样器算法最大的区别:

我再强调一遍,如果某个反射模糊材质的模糊细分是40,场景中某个灯光的阴影细分是10,DMC的最大细分值设成5,那么材质反射模糊的最大细分值就会变成8(40/5),灯光阴影的最大细分值就会变成2。要知道我们现在说的是每一条嗅探光线对应的反射模糊采样细分。如果Vray认为这个像素需要不止一条嗅探光线的话,比方说,Vray认为这个像素需要最大细分也就是5的平方25条嗅探光线,那么最终Vray还是会在这个像素点上采细分为40的反射模糊样本总数(40的平方是1600个样本),因为每条嗅探光线的细分是8(64个样本),乘以最大细分5的平方25条嗅探光线,最终就是64×25=1600个样本,8的平方乘以5的平方不就是(5×8=40)的平方嘛。晕了?可能会有点晕,至少这件事我花了几天才搞清楚,因为Vray的说明文档里没有解释。


这张图表示了DMC如何控制全局模糊采样的总量。初始的模糊细分是100(一共10000个样本)。第一行DMC最大细分是5,Vray就把材质的模糊细分降为了20。最后一行最大细分已经是50,那就是最多往这个像素打2500个嗅探光线,于是Vray就让每条嗅探光线最多采细分为2的反射模糊(4个样本每条)。这样总计最多还是10000个样本。

现在我们知道了DMC采样器会把全局的细分值都除以最大细分,我们可以再回顾一下自适应性的概念,以及自适应采样的过程。在自适应细分中,这个过程非常直观,因为自适应细分采样器不会影响全局的细分数值。

因为DMC会把需要多个采样的的像素的细分值除以一个数值,那么当DMC的最大细分比较小的时候,自适应性还会体现出它的作用。如果把DMC的最大细分设置为1,那么现在它和自适应细分的逻辑差不多,每一条嗅探光线对应材质(反射,折射,阴影)细分数平方的二次光线。但是因为DMC算法的原理,如果把最大细分提得非常高,比如50,那么你几乎就不用考虑自适应性的问题了。因为如果你把DMC的最大细分设成了50(举个例子),Vray就会把场景中所有的细分都除做1,模糊反射是1,灯光阴影是1,运动模糊也是1。Vray之所以敢这样做是因为Vray知道它可以最多在这个像素上采细分为50的样本,也就是大约2500条嗅探光线,那么它仍然能够得到一个非常好的反射模糊,尽管每条嗅探光线只采1个反射模糊样本。

这样做很有用是因为,在一个有大量运动模糊,景深,反射和折射模糊的三维场景里,Vray想要以最少的样本来得到最好的结果。在这样的情况下,最好的处理方式就是把DMC的最大细分设置的非常高。如果还有必要,可以单独地调整个别材质的参数。通常情况下,运动中的物体是模糊的,那么对这种物体就没必要采很精细的反射模糊样本,因为到头来所有细节都会被模糊掉。自适应细分就不懂这个道理,它还是会向这个模糊反射投射大量的样本,尽管这个反射模糊对最终效果的影响已经不大了。下图案例是非常简单的情形,我用到了自适应细分和DMC采样器,你可以明显的看到DMC碾压了自适应细分采样器。


三维运动模糊
DMC采样器

三维运动模糊
自适应细分采样器

DMC采样器最大的问题就是参数的设置逻辑不直观。在一个有大量模型细节,灯光,运动模糊和景深的场景中,DMC参数最好设置的比较高,比如最小细分1,最大细分50,因为如果最大细分设置小了,比如4之类的,会大大增加这种场景的渲染时间。最后我们来看几个实例。

例 01:毛发

毛发采样是个大难题。毛发模型充斥着大量的细节,绝大多数光线追踪算法都难以高效高速的对毛发模型进行采样。自适应细分采样器在这种案例里的表现就更差了,它根本就不知道该在哪里进行深度采样。相反,DMC采样器的表现就非常出色,它可以快速采样毛发而且不会出错(断线,画面闪烁等)。同等图幅同等时间下,DMC比自适应细分的表现好很多,在下图中可以看得很清楚。DMC的参数是最小细分1,最大细分50,颜色阈值0.02,自适应细分的最小比率是0,最大比率是2,颜色阈值是0.5。我之所以把自适应细分颜色阈值设得很宽松,是因为如果我用正式动画参数(0.1或0.05),自适应细分的单帧渲染时间就长得离谱了,基本是20分钟1帧。



自适应细分采样器


DMC采样器

现在还没解决的问题是,渲染毛发究竟用什么参数好呢?我一般把DMC的最小细分设成1或2,最大细分设成50。如果动画渲染的时候,场景中有些细节没捕捉到,那么把最小细分改成2一般就能解决。颜色阈值可以是很小的数字,比如0.02或0.005。不用理全局DMC采样器的参数,因为自适应程度什么的已经可以忽略不计了。因为我们的DMC最大细分设成了50,那么全局的细分已经被除成了1。后果就是每条嗅探光线打到模型上以后,Vray会从该点反弹出一条二次光线,来计算光照或反射模糊等。在毛发场景中这种参数效果很好,是因为在高细节场景中,初始嗅探光线是越多越好的(一般每像素100-300条),二次光线相比之下就没这么重要了。


最小 1 最大 4

最小 1 最大 10

最小 1 最大 50

你可以看出来图3效果最好。平滑度很高,而且我跟你保证即使是动画的时候也不会有明显的闪烁。在Blur工作室期间我一般会把毛发单独渲染一个通道,参数是最小1,最大50,其他模型设置成蒙版(Vray物件属性)。然后后期把毛发合成回去,因为一般情况下,场景里的其他东西根本用不着50的最大细分。

例 02:平整表面,模糊反射

一个看起来比较有意思的事实是,在有些场景中,DMC最大细分设在4左右可以在较短时间内得到噪点较少的图片。什么场景是这样的呢?就是场景中基本都是平整大面但是反射模糊很多,4这个参数意味着对材质表面采样更细致而对模型体块采样更少:


最小 1 最大 5
反射细分 50

最小 1 最大 50
反射细分 100

最小 1 最大 10
反射细分 50

最小 1 最大 50
反射细分 300

最小 1 最大 50
反射细分 50

最小 1 最大 50
反射细分 1000

我们来看一下修改最大细分参数以后,场景中的样本分布(勾选“显示样本”)。把5改成50以后,场景中的样本明显变多了。


最小 1 最大 5
反射细分 50

最小 1 最大 50
反射细分 100

最小 1 最大 10
反射细分 50

最小 1 最大 50
反射细分 300

最小 1 最大 50
反射细分 50

最小 1 最大 50
反射细分 1000

很奇怪不是么?第一幅图最大细分为5的时候,采样样本要比第三幅图最大细分50的时候要少得多(但是第一幅图效果反而好)。还记得我讲过的DMC会把全局参数都除一下。这里就是一种典型的情况。我把反射细分设为了50,那第一幅图DMC最大细分是5,意思就是每条打到地板上的嗅探光线会发出最多100条反射模糊样本(反射细分是10),但是当DMC最大细分是50的时候,每条嗅探光线仅仅只会打出1个反射模糊样本。所以就是说,DMC最大细分设成50的时候,Vray没法根据这么少的二次反射判断正确的反射着色,此时Vray需要的是更多的反射光线,初始的嗅探光线数量变得不那么重要,因为场景里基本都是大平面。

第二行的最大细分是50,我修改的是地板和墙面反射材质的反射细分。你可以看到修改反射细分也会增加场景中的初始样本数量。在这种情形,你可以大胆的把材质细分加到300,因为到时候它被50一除,就只剩6的细分了(也就是每条嗅探光线对应36个二次采样),这样做其实反而可以在保证相同反射质量的情况下加快渲染速度。

例 03:次像素级采样(Vray颜色映射选项卡)

我大多数情况下开着次像素级采样功能渲染场景和动画。如果你是做静帧渲染,并且追求最真实的效果,那么你可以关掉这个选项。但是如果是有景深和运动模糊的动画,最好就把这个参数勾选,因为渲染时间会随之下降,并且运动模糊和景深的噪点会少很多。勾选不勾选次像素级采样的区别在于,当你勾选的时候,渲染器在采样像素时所采到的初始样本会先进行颜色映射,然后求平均色,得到这个像素的总颜色。不勾选的时候,一个像素中所有样本数据会先求像素平均色,再进行颜色映射。下图示意了这个过程。


勾选次像素级采样
当次像素级采样开启的时候,每一个在像素内部新采集到的样本都会先进行颜色映射(按照颜色映射面板中的设置或者摄像机曝光参数的限制,先压缩一次颜色信息),然后平均到既有的像素平均色里。

不勾选次像素级采样
不勾选次像素级采样的时候,像素内部所有的样本信息都会先被平均到一起,然后整个像素的数据进行颜色映射,得到这个像素的最终颜色值。这个流程下来得到的图片会更真实,但是往往会出现一些噪点,特别是在有三维空间运动模糊和景深的时候。

实际操作中是这样的现象:


次像素级采样 关闭
DMC 最小 1 最大 50

次像素级采样 开启
DMC 最小 1 最大 50
我们可以清楚的看到这个参数对正式图有什么影响。右侧勾选了次像素级采样,结果会更干净平滑,渲染也更快,但是它高光区会变暗一些,渲染结果也不是最真实的。

次像素级采样 关闭
DMC 最小 1 最大 1

次像素级采样 开启
DMC 最小 1 最大 1
把DMC的最大细分参数改成1,就意味着反射光线的细分数不会被DMC的最大细分除,那么我们勾不勾选次级像素采样结果都是一样的。

以下是发生这种现象的原因:当DMC参数是1的时候,Vray只会往每个像素发射一个初始嗅探光线,那它打到模型以后会收集30个反射模糊样本,反射模糊信息被平均到一起,然后和材质固有色信息再整合一下,最后进入颜色映射,得到像素的总颜色。因为每个像素就只有这一个反射模糊样本(没什么可平均的),所以勾不勾选次像素级采样结果都一样了,反射的亮度也就被保留了下来。和第一行的例子相比,我把DMC设成了50,意味着反射模糊细分被除成了1,那就是每条初始嗅探光线只采一个反射模糊样本,然后这个颜色和材质固有色信息整合,最后进行颜色映射。因为我用了DMC最大细分50,为了得到光滑的反射模糊,Vray就会比第二行案例多打出很多初始嗅探光线,进行反射模糊采样,因为每条初始光线所采集到的反射模糊信息非常少。

这种样本少造成的亮度变暗可以通过修改材质参数来弥补,调高反射细分就行。在我的案例中,如果我的DMC设成了50,那么我的反射模糊细分就可以改到500,就相当于(还记得那个表格吗?)Vray会让每条嗅探光线打出细分为10的反射模糊采样(100个样本)。这样一来亮度就可以和不勾选次像素级采样一样亮了,同时你可以享受勾选次像素级采样的好处(高亮噪点消失了)。

例 04:场景中同时有10个以上的Vray面光源

当场景中有大量的Vray面光源的时候,DMC特别有用,尤其是有运动模糊和景深的时候。下图展示了这一点,我的场景中有100个Vray面光源,你可以看到DMC完爆自适应细分采样器。两图的噪点数量差不多,个别地方DMC要比自适应细分好,个别地方要逊色一些,但是要知道我用的是DMC最大细分50,这个参数已经很高了。当模糊场景中光源特别多的时候,使用灯光缓存引擎特别有效,一定要记得这一点。


自适应细分采样器
最小比率 0 最大比率 2 颜色阈值 0.05

DMC采样器
最小细分 1 最大细分 50 颜色阈值 0.02

例 05:发光贴图采样质量也被全局DMC参数控制

有一点要了解,当想要消除发光贴图采样的噪点以及闪烁的时候,发光贴图的质量也是被全局DMC参数控制着的。


自适应程度 1
噪波阈值 0.01
最少样本 8

自适应程度 0.5
噪波阈值 0.01
最少样本 8

自适应程度 1
噪波阈值 0.01
最少样本 128

问题往往出现在自适应数量设成1的时候,我猜发光贴图在这时候就不会打出足够多的初始GI采样,也就无法正确的判断是否还需要对场景进一步采样。这种情况可以通过改成小于1的自适应数量来弥补,第二幅图就改成了0.5,你可以明显看到GI采样变好了,或者可以通过提高最少样本来弥补,比如给一个高参数128。

总结

希望我讲解得还算清楚,这块知识确实有点难理解。我看很多人因为DMC牵一发动全身,就放弃掉了,转回了自适应细分采样器,因为至少自适应细分的参数带来的结果比较好预测。但是相信我,只要你懂了DMC采样器的原理,你就再也回不去了,因为全局参数的威力在于你能充分控制渲染器的采样精度,建立了这种思维方式以后,你可以用更短的时间渲出更平滑干净的图。祝渲染顺利!

版权所有 Toni Bratincevic

www.interstation3d.com


注1:渲染器大致可以分为物理渲染器和非物理渲染器,英语缩写是PBR和NBPR,即physical based rander和non-physical based rander。区别在于是否遵守能量守恒原则,遵守现实物理的公式。这是渲染器的分类。
那么在光线的算法方面细分下来,有“偏差算法”和“无偏差算法”两种,英文是biased和unbiased,大体可以理解为算法本身是不是遵循能量守恒原则,有没有系统误差。
所以排列组合起来,渲染器有“有偏差的非物理渲染器(Vray很典型,有很多取巧的算法,效率很高,但是不是物理严谨的)”、“无偏差的物理渲染器(Maxwell比较典型,踏踏实实硬算)”和“有偏差的物理渲染器(这种也是存在的,算是提取了两者的优势,又快又真实)”三种。(从逻辑上说,应该是没有“无偏差的非物理渲染器”)。

韩世麟 2015.01.08 译

版权声明

本文插图部分版权归原作者及www.interstation3d.com网站所有,中文译本版权归属译者本人。转载之前请务必联系译者:联系站长

网站推广阶段,欢迎您关注网站的微信公共平台:
扫描关注“韩的日志”微信订阅号

  • 请注意,为了保证我能看到所有留言的提示,留言将通过审核后才会显示,请不必重复留言。
韩世麟

韩世麟

站长,天津大学研究生,天津人
存为书签: 本文的固定链接.

49 条评论

  1. “在使用自适应细分采样器的时候,为了得到干净的结果,场景中几乎所有的地方都会某种程度上的被过度采样,比如当初始采样遇到反射模糊,折射模糊,brute force GI,景深和运动模糊时,渲染器几乎都会以参数设定的最大值来采样,然后所有的信息被加在一起求平均色,然后这个颜色被拿来和周边比较,最后得出需要进一步采样的结论。意思是比如你设定用20个样本求景深,10个样本求运动模糊,100个样本用来求反射模糊,那就很可能你每一个像素都要事先采集极多的信息。这样的确可以求出非常干净平滑的结果,但是代价是极长的渲染时间,因为你每增加一个初始采样样本,那么计算机就要采集后续的一整套景深,运动模糊,反射模糊样本,但其实很多时候你根本没必要在一个像素上采这么多的二次光线(反射,折射,阴影等),就可以得到很好的结果了。这时候,像DMC这样基于像素内部采样的算法就大显神通了,它们会控制所有需要进一步采样的像素(比如反射模糊)的采样数量。”这一段里关于“每增加一个出事采样样本就要采集后续一整套样本”和DMC采样的优势没有看懂…能不能再请教一下学长改如何理解…

    • @Transfer 自适应细分的情况如下:每增加一条eye ray(嗅探光线),就意味着增加了130二次采样样本(20个样本求景深,10个样本求运动模糊,100个样本用来求反射模糊)。eye ray越多,二次采样那是翻着倍的往上走。
      DMC的情况则不同,我正在翻译,你现在会看到,当我设定了某个材质的反射模糊细分是50的时候,这个像素上最多采2500个反射模糊样本,DMC采样器eye ray越多,每条eye ray牵连的二次采样就越少。(其总乘积不变)
      自适应细分则不同,eye ray越多,每条eye ray所采的样本并不会相应减少。所以样本总数在增加。

  2. “这样总计最多还是1000个样本。”是不是少打了一个0?

  3. 赞!闲下来再认认真真看(づ ̄3 ̄)づ╭❤~

  4. ”从逻辑上说,应该是没有“有偏差的物理渲染器””
    —-结合上文,这句应该是否为“从逻辑上说,应该是没有“无偏差的非物理渲染器””?

  5. 特地註冊一個賬號來以示感謝,您的網站讓我看到另一種態度,學習,生活的。。。。不勝感激。。!!

  6. 老师你好,我想请教一下,DMC全局采样栏里的参数会影响发光图的质量吗?

  7. 老师 我想问一下 DMC采样器中的自适应数量 只是针对于二次光线的样本?? 对自适应DMC采样器中的最大细分有没有影响??

  8. 韩老师 为什么选用固定采样器的时候 细分为50 的时候 图像不会出现噪点,而选用自适应DMC采样器的时候 最小细分为1 最大细分为50 的时候 图像全是噪点。 按上面说的(固定、DMC)嗅探光线越多 相应的每条初始光线对应的二级光线就越少 我觉得固定细分的参数越大 图像也应该充满噪点啊!!

    • @多福多寿 特别好的问题,我思考了一会。首先,你说的没错,“嗅探光线越多 相应的每条初始光线对应的二级光线就越少”。但是让我们来看看,在固定和自适应DMC都选择50的时候,发生了什么:
      1.固定比率,细分50:每个像素至少会得到50个二级光线的采样。
      2.自适应DMC:只有极少的像素会得到50个二级光线的采样,大部分平面采样会采取最小细分1,嗅探光线很少,二级光线很少。

      所以为什么,就很明显了。

      固定比率是有保底采样数目的。自适应一旦采取了最小细分,噪点就出来了。

  9. 嗯嗯。。。老师那么在自适应dmc采样器不勾选的颜色阈值的情况下,是依据什么来进行进一步嗅探光线的发射。

  10. 自适应细分,每增加一条嗅探光线,所对应的二次光线就会翻倍的向上涨。
    那么,在自适应细分中,反射细分的参数只是一条嗅探光线的二次光线的上限值。而在自适应DMC中,反射细分的参数是这个像素的所有二次光线的上限值。 老师我这样理解对不对。。。。。

  11. 老韩,为什么不把活力网的视频发自己网站上

  12. vfs可以设置模糊吗

  13. 韩老师你好,请问假设DMC Sampler里的Min Samples设置了一个128,而材质里细分只给了8,那采样数是128还是64,哪个优先级比较高?

  14. DMC的最大细分值设成5,反射模糊材质的模糊细分是40,那么材质反射模糊的最大细分值就会变成8(40/5);Global DMC卷展栏中 adaptive amount是0.5的话,如果发射一个eye ray 会射出最大8x8x0.5=32条反射采样光线是么?

  15. 您好,韩神。
    1、为什么自适应蒙特卡洛的最大细分为50是的时候全局细分变为1?比如反射模糊细分为8,8/50=0.16,而根本没有0.16条的采样点或采样线,所以默认1为最低值?
    2、毛发案例(不用理全局DMC采样器的参数,因为自适应程度什么的已经可以忽略不计了。因为我们的DMC最大细分设成了50,那么全局的细分已经被除成了1。)–为什么可以忽略?是因为初次采样细分已经足够了对没有大量反射/折射模糊的毛发形成足够质量的图像,而全局dmc主要来控制二次采样(计算折射、反射模糊及阴影等质量)所以可以进行了忽略。
    3、茶壶反射那个案例。而最大细分为50时最小为1时,调整反射细分300 ,或者600或者更高,文中说不会影响渲染速度?加快速度是因为一次采样的获得反射模糊信息变多了,反而减少一次采样的次数,从而提升或者不会影响渲染速度吗?

    • @aabb 我一个一个来回答。第一个问题,你说的对。已经是零点几了,都会看做1。

    • @aabb 第二个问题,自适应程度控制的是这样的东西:例如,如果一只嗅探光线打到物体表面。后续会打出二十条二次光线的话。自适应0.5,意味着它会先打出十条光线。

      但是现在,每只嗅探光线,后面只会打出一条二次光线。所以自适应不自适应就完全无所谓了,没得选,反正只有一条。

    • @aabb 第三点,情况比较复杂。他说你可以大胆给300的意思是。最大系分是50所以即使给到300,除以后,只剩六。并不算大。

      他说同等质量下反而会加快速度的意思是。这种同时大胆提高最大细分和反射细分的做法。能够比较合理的分配嗅探光线数和二次光线数。让你不要害怕大数值。因为一般人都不敢提高。只是靠颜色阈值慢慢的磨。

发表评论