译/韩世麟
本文是戴巍老师在他的博客“戴老师的渲染作坊”中提到的关于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
注1:渲染器大致可以分为物理渲染器和非物理渲染器,英语缩写是PBR和NBPR,即physical based rander和non-physical based rander。区别在于是否遵守能量守恒原则,遵守现实物理的公式。这是渲染器的分类。
那么在光线的算法方面细分下来,有“偏差算法”和“无偏差算法”两种,英文是biased和unbiased,大体可以理解为算法本身是不是遵循能量守恒原则,有没有系统误差。
所以排列组合起来,渲染器有“有偏差的非物理渲染器(Vray很典型,有很多取巧的算法,效率很高,但是不是物理严谨的)”、“无偏差的物理渲染器(Maxwell比较典型,踏踏实实硬算)”和“有偏差的物理渲染器(这种也是存在的,算是提取了两者的优势,又快又真实)”三种。(从逻辑上说,应该是没有“无偏差的非物理渲染器”)。
韩世麟 2015.01.08 译
版权声明
本文插图部分版权归原作者及www.interstation3d.com网站所有,中文译本版权归属译者本人。转载之前请务必联系译者:联系站长
网站推广阶段,欢迎您关注网站的微信公共平台:
- 请注意,为了保证我能看到所有留言的提示,留言将通过审核后才会显示,请不必重复留言。
“在使用自适应细分采样器的时候,为了得到干净的结果,场景中几乎所有的地方都会某种程度上的被过度采样,比如当初始采样遇到反射模糊,折射模糊,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所采的样本并不会相应减少。所以样本总数在增加。
“这样总计最多还是1000个样本。”是不是少打了一个0?
@诞皇派 没错没错,已修改!感谢!
赞!闲下来再认认真真看(づ ̄3 ̄)づ╭❤~
”从逻辑上说,应该是没有“有偏差的物理渲染器””
—-结合上文,这句应该是否为“从逻辑上说,应该是没有“无偏差的非物理渲染器””?
@william 对,我当时绕晕了。
特地註冊一個賬號來以示感謝,您的網站讓我看到另一種態度,學習,生活的。。。。不勝感激。。!!
老师你好,我想请教一下,DMC全局采样栏里的参数会影响发光图的质量吗?
@qmy0508 文章结尾写了,会
@韩世麟 dmc采样器和光采样环节是分开的
@qmy0508 不过是全局dmc在控制。
@韩世麟 谢谢,那可以这么理解吗?如果DMC全局自适应程度用0.9来跑小光子图,然后出大图时再把这个改小,事实上这个数值再改小已经不起作用是吗?还有噪波阈值也会影响光子图吗?老师方便留个QQ吗?问题困扰我很久了。
@qmy0508 DMC全局自适应程度用0.9 意味着自适应程度高达90%,也就是非常宽松。那么此时跑出来的光子图就不匀。
正图的时候改成0.7,可以在出图阶段抗锯齿的效果好,但是光子的原材料就没那么好。
@韩世麟 我现阶段是这样处理的:用小光子渲大图(后来网上有论证不必要),我的操作方式。打个比方,渲400的小光子图,灯光缓存用细分用1000,采样大小用0.005,发光贴图。最小-3 最大-1 半球细分50 插值采样30,DMC采样,自适应数量0.9 噪波0.1 最小采样为8,固字比率,然后出1600的大图,开启DMC自适应,和抗剧齿。自适应改到0.85 噪波0.005.想请教一下老师我这种做法是不是错误的?
@qmy0508 建议跑光子的时候,自适应数量0.85,噪波阈值0.01,否则光子图不太均匀。
@韩世麟 好的,非常感谢韩老师的耐心解答,还有最后一个问题。就是灯光细分和材质细分。与光子图有关系吗?
@qmy0508 实际测了一下,没关系
@韩世麟 跪谢。。真的帮我大忙了。不早了,老师也早点休息吧。
@韩世麟 老师我想问一下,这颜色阈值和噪波阈值控制的是一个东西吗!谁的参数管用
@RANGAN 请看这两期:http://hanshilin.com/software/vray-for-su/v-ray-3-4-for-sketchup-settings/
http://hanshilin.com/software/vray-for-su/v-ray-sample/
老师 我想问一下 DMC采样器中的自适应数量 只是针对于二次光线的样本?? 对自适应DMC采样器中的最大细分有没有影响??
@18435117897 就是针对二次光线的,因为只有他们才是样本,嗅探光线只负责戳出第一个交点。对最大没影响。
韩老师 为什么选用固定采样器的时候 细分为50 的时候 图像不会出现噪点,而选用自适应DMC采样器的时候 最小细分为1 最大细分为50 的时候 图像全是噪点。 按上面说的(固定、DMC)嗅探光线越多 相应的每条初始光线对应的二级光线就越少 我觉得固定细分的参数越大 图像也应该充满噪点啊!!
@多福多寿 特别好的问题,我思考了一会。首先,你说的没错,“嗅探光线越多 相应的每条初始光线对应的二级光线就越少”。但是让我们来看看,在固定和自适应DMC都选择50的时候,发生了什么:
1.固定比率,细分50:每个像素至少会得到50个二级光线的采样。
2.自适应DMC:只有极少的像素会得到50个二级光线的采样,大部分平面采样会采取最小细分1,嗅探光线很少,二级光线很少。
所以为什么,就很明显了。
固定比率是有保底采样数目的。自适应一旦采取了最小细分,噪点就出来了。
嗯嗯。。。老师那么在自适应dmc采样器不勾选的颜色阈值的情况下,是依据什么来进行进一步嗅探光线的发射。
@18435117897 依据全局DMC的噪波阈值
@18435117897 或者说,就是依据之前采好的信息,有什么算什么了,就不进一步抹平了
@18435117897 只可惜这件事在VFS上看不出来,因为这个版本的VFS无论你勾不勾选使用全局DMC的噪波阈值控制色彩阈值,他都会读取你写在那里的色彩阈值,即使它是灰色的。这个肯定是bug了
@韩世麟 韩老师,我最大采样50的时候,画面会有很多噪点,但是我把颜色阈值调低,画面就会减少噪点,但是渲染时间会增加,这种调低颜色阈值的方式和增加材质反射细分的方式是不是不一样
@jjj3344260 对,不一样,应该调细分
@韩世麟 嗯,那我想问下50的最大采样,材质反射细分和灯光的细分分别应该给多少才合适,还有一般出图最大采样给到多少就够了
@jjj3344260 给到噪点问题满意为止
@韩世麟 还有另外一个问题就是,DMC采样器那里的细分倍增是控制场景的所有材质和灯光还是只控制材质
@jjj3344260 所有
@韩世麟 最后一个问题,IES的阴影细分似乎完全不影响它的光的质量和阴影的质量,目前来说我的测试是如此的,真的没有影响吗?
@jjj3344260 是
自适应细分,每增加一条嗅探光线,所对应的二次光线就会翻倍的向上涨。
那么,在自适应细分中,反射细分的参数只是一条嗅探光线的二次光线的上限值。而在自适应DMC中,反射细分的参数是这个像素的所有二次光线的上限值。 老师我这样理解对不对。。。。。
@18435117897 正确。
老韩,为什么不把活力网的视频发自己网站上
@roronoa 这是个免费博客
vfs可以设置模糊吗
韩老师你好,请问假设DMC Sampler里的Min Samples设置了一个128,而材质里细分只给了8,那采样数是128还是64,哪个优先级比较高?
@mentholrain 你这问题高端了,我问问官方吧,还真不好测试
DMC的最大细分值设成5,反射模糊材质的模糊细分是40,那么材质反射模糊的最大细分值就会变成8(40/5);Global DMC卷展栏中 adaptive amount是0.5的话,如果发射一个eye ray 会射出最大8x8x0.5=32条反射采样光线是么?
@pkp1988 对
@韩世麟 全局dmc本来就是控制2次采样质量的,为什么不是先用40*0.5在去除最大细分?既然最大细分已经对我的二次采样数量进行了控制,那要全局dmc感觉没什么用啊?全局dmc才是控制二次采样的数量从而提升一次实现采样点的质量!
您好,韩神。
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,意味着它会先打出十条光线。
但是现在,每只嗅探光线,后面只会打出一条二次光线。所以自适应不自适应就完全无所谓了,没得选,反正只有一条。
@韩世麟 老师您好:
1、“每只嗅探光线,后面只会打出一条二次光线”与Min Sample中解释“最少样本就是进入自适应前,初始采样数目的下限值”是否冲突?是不是每只嗅探光线最少也有Min Sample中这么多条二次光线?而不是一条?
2、如果每只嗅探光线后面打出的不是一条二次光线,而是4条二次光线(只是列举一个比Min Sample小的数,此时的Min Sample假设为16),那么每只嗅探光线是不是会打出16条二次光线吗?
@LeonYang 嗯,我理解的话,还是一条。只不过最小样本8的情况下,会根据这个打出八个首次嗅探光线,每个带着一条次级。
@韩世麟 老师您好,Min Sample 不是只控制反射光线样本吗?怎么还与首次嗅探光线有关系,首次嗅探光线的数量不是仅受Min/Max subdivs控制吗?谢谢老师
@LeonYang 是这样:首次射线并不是样本,它的作用是从摄影机射出,与几何体形成“交点”。样本是由次级射线去采集的。但是想要采集样本,先要有首次射线,然后才是次级样本。
@aabb 第三点,情况比较复杂。他说你可以大胆给300的意思是。最大系分是50所以即使给到300,除以后,只剩六。并不算大。
他说同等质量下反而会加快速度的意思是。这种同时大胆提高最大细分和反射细分的做法。能够比较合理的分配嗅探光线数和二次光线数。让你不要害怕大数值。因为一般人都不敢提高。只是靠颜色阈值慢慢的磨。
韩大,我测试了下 在自适应dmc下, 1,40,200细分 相比1,4,20细分,画面质量会有所增加,同时渲染时间会长一些。这样的话在质量和时间二者之间还是很难取舍啊。能不能总结下什么情况下用50的最大值 什么时候用4 相应的材质细分该调多少。。
@bmwhp2 用新版3.4,这些事情V-Ray会自动为你调好。
@韩世麟 非常感谢回复!我放弃vfs了,在学vray for max。昨天用自适应细分渲了一张2000的大图,amd 1800x花了80分钟,感觉慢的有点蹊跷,所以来深入学习下dmc和自适应细分的区别的。没完全看懂文章,但是基本了解一些了哈哈
@bmwhp2 现在的版本是这样,max的3.3版以后也把材质细分去掉了,把自适应细分算法也删掉了,这其实是非常聪明的做法,再也不用费心调细分参数了。自适应DMC采样器是首选。老版本的自适应细分不适合细线等细节,也不适合运动模糊。推荐max上高版本的V-Ray。
@韩世麟 嗯 慢慢来吧,参数都是后面的事,先把建模,贴图,材质和打灯玩好再说。谢谢韩大
@bmwhp2 好的
文章里图片都不能加载
@KLTG 换个浏览器试试看哈
vray是怎么确定一个像素里需要多少条嗅探光线的?
@101010 这个是在采样过程中,根据所返回来的信息,决定是否增加样本的。举个例子,比如说你设置最大细分8。那这个像素里最多采64个次级样本。然后采到30多个的时候,如果返回来的信息,对像素所造成的色彩贡献,微乎其微了,也就是小于你设定的颜色阈值了。那就终止。
@101010 https://v.youku.com/v_show/id_XMzQyNjA5NzQ2NA==.html?spm=a2hzp.8253869.0.0 这个是官方3.3以后的采样教程,颜色判定的时候,dmc采样颜色判断的时候,是看自身内部同时也看周围的。按照视频做就好了。
最小细分和最少采样的区别或慨念是什么?
@101010 其实都是代表最少采多少次级射线,但是最少采样是一个下限值,优先值高于最小细分。举个例子吧,比如设置最小细分是1,最大细分是8。最少采样是8。那么在实际采样的时候,会根据最少采样数,先采8个次级射线。那么其实此时最小细分1(一个像素,一个次级样本)就没什么意义了。但是如果你设置最小细分8,最大细分16,那么此时最小细分就很有意义。因为每个像素里根据最小细分8,至少要采64个次级射线。
@韩世麟 最小细分1.最少采样8(最终采数大的次级射线8,最小细分的数值1包含在大数值8内。)
最小细分8.最少采样8(最终也是采数大的次级射线64,最少采样的数值8也包含在大数值64内,并且我也感受不出作为优先级的最少采样在这时和最小细分有什么差别。)
两种情况都采取其中的最大数值,我看不出最少采样的优先级优先在哪里。麻烦你再解释解释吧!
渐进采样器里的噪波阈值和全局DMC里的噪波阈值有什么区别呀?
@101010 vray的所有随机计算,都要依靠dmc。所以全局dmc的阈值也控制了材质细分,发光贴图等等。而图像采样器里的阈值,控制的是最终图像。这两个阈值一般维持相等。或者全局的更精细,图像采样器的可以放松。此时全局阈值会起主导作用。
自适应细分采样器决定是否继续采样是根据像素上所有采样点的平均色与像素边缘采样点的平均色进行比较…是这样理解的吗?
“意思是在这50个初始样本以后,每增加一个样本都会和这50个样本计算平均色,来检查这个新样本带来的颜色变化是不是大于噪波阈值,如果真的大于…”————位于“噪波阈值”的解释。
也就是说如果增加一个样本,即51个样本,这51个样本计算的平均色会与先前那50个样本计算的平均色进行比较判断是否继续采样。
“DMC采样在决定是否进一步采样时依据的是目标像素像素周边的所有像素的实际颜色值 ”————位于“欢迎来到DCM的世界”的右图“DMC采样器”的下面。
那它是怎么在自身单个像素颜色差异的变化过程中进行判断又和周边像素的实际颜色值进行比较的呢?难道一条嗅探光线发出的二次光线可以在多个像素中采集到?另外现在的渐进采样器是不是差不多是以前的DMC采样器?如果是的话是不是分别受我上面问的那两个噪波阈值控制的呀?
@101010 就是一个新的样本进来了,带来了新的贡献,查看这个新的贡献是否超过了阈值?如果小于就不用继续采样了。渐进式的采样就是dmc。
请问渐进是怎么计算的呢?
@mrww8888 请看最新采样视频http://hanshilin.com/software/vray-for-su/v-ray-sample/
@韩世麟 嗯,摄像机射线的原理我是懂的,只是不知道渐进的核心原理和块渲染的区别。
我一直以为是这样的,每一个像素都先发射一条摄像机射线,然后发射一条二级射线,所有第一条二级射线都计算完毕,再发射第二条二级射线,以此循环。所有像素的第一条摄像机射线都计算完毕,再发射第二条摄像机射线,以此循环。直到达到阈值,像素不再计算。
还有GI的计算方式,也和块渲染区别很大,块渲染是把GI全计算完再渲的,渐进似乎直接把GI计算搬进过程里了
@mrww8888 其实您理解的没有问题,确实是先计算第一个aa射线的次级射线,再计算第二个。渐进和块其实原理是一模一样的。渐进的最大细分默认是100,也就是不设限制。小块式的最大细分,如果也改成100的话,跟渐进就没啥区别了。终止的条件都变成了阈值。出来的结果也是极其类似的。
老哥你的视频都是精品,赞一个