本文为译文,为便于阅读适当加入了意译的成分,原文自Thinkbox官网。虽然是以max平台的kk为基础,实际上针对kk独立版或者for
maya原理也是一样。
§ 1.1 概述
§ 1.2 基础场景
§ 1.3
100w粒子,不同的密度渲染测试及结论
§ 1.4
1000w粒子渲染测试及结论
§ 1.5 输出分辨率对粒子渲染效果的影响
§ 1.6
1000w粒子的体素渲染测试及结论
§ 1.7 1亿粒子渲染测试及结论
§ 1.8 消除阴影的摩尔纹瑕疵
§ 1.9 丝状烟的效果
§ 1.10 结论
1.1 概述
§ 一般对Krakatoa渲染器有个通常的误解:因为它是一个粒子渲染器,而点渲染(point
rendering)本来就应该是带有颗粒感的。
§ Krakatoa渲染的一般准则总是如此:使场景中具有尽可能多的粒子,并让每一个粒子的密度相对都较低,这些低密度的海量粒子累积在一起就能够得到过渡非常光滑的渲染结果,实际上单独渲染其中任意一个粒子都是几乎不可见的。
§ 至少在渲染火焰、等离子体(plazma)和丝状烟的情况下,这是正确的方法。在这几种情况下需要大量的partitions(分区)以及非常低的每粒子密度值才能避免粒子渲染的颗粒感。
§ 下文将会测试不同粒子数量和不同密度情况下的渲染结果,用于演示在Kraktoa中如何得到一张“干净的、光滑的、无颗粒感的”渲染图像。
1.2 基础场景
§ 为了探究粒子数量及每粒子density对最终渲染效果的影响,我们用一套非常简单的Particle
Flow粒子流在100帧的时间里产生100w粒子。
§ 这套Particle
Flow粒子流中使用了一个Force
Operator用以给粒子施加一个带Turbulence的Wind力场,同时也用了一个默认参数的Drag力场。
§ 这套粒子流之后用Krakatoa做了partition。每一个partition的第100帧都包含100w个位置稍有不同的粒子,这种位置上的不同是由position
operator上的random seed的变化产生的。
§ 这些partition之后都用一个PRT
Loader加载进场景,视口中只显示一个partition的粒子量,但渲染却会使用各种数量的partition以及不同density的组合来测试最终渲染图像的变化。
1.3
100w粒子,不同的密度渲染测试及结论
§ 首先,让我们看看单个partition用”density:5.0,exponent:-1或-2或-3或-4”几个不同值的渲染效果:
density:5.0,exponent:-1
density:5.0,exponent:-2

density:5.0,exponent:-3
density:5.0,exponent:-4
§ 从图中容易看出,第一张图(density:5.0,exponent:-1)颗粒感最重,此时粒子密度值为0.5.
§ 从YouTube网站的视频中,很容易发现那些想要每一颗粒子都可以完全被看到,为那几百万粒子产生的效果而感到印象深刻的艺术家们(稍带讽刺意味)。
§ 可以看到在0.005的密度下大多数的颗粒感都不见了,而在0.0005(5.0/-4)的情况下渲染的结果可以用来做丝状的香烟烟雾。
1.4 1000w粒子渲染测试及结论
§ 现在让我们读入10个partitions(共1000w粒子),并把密度设为0.0005渲染的结果,与读入1个partition(100w粒子),并把粒子密度设置为0.005(也就是密度为之前的10倍)的渲染结果做比较:
前者:1000w粒子,密度0.0005
后者:100w粒子,密度0.005
§ 可以看到,最终的空间密度(1000w*0.0005
=
100w*0.005)是相等的,但是密度只有后者十分之一的1000w粒子产生的图像几乎比前者光滑10倍。
§ And here is the rendering of 10 partitions
with Density of 0.005 (left)compared to 1 partition with Density of
0.05:
§ 下面的渲染测试则是:A图10个partitions,1000w粒子,密度0.005,B图1个partition,100w粒子,密度0.05:

A:10个partitions,1000w粒子,密度0.005

B:1个partition,100粒子,密度0.05
§ 同上一次的测试结果一样,使用10倍多的粒子数量配合10倍少的密度会产生类似的体积渲染效果,但是噪点会少很多。
§ 为了读者能看到更多的信息,下面是10个partitions共1000w粒子的渲染日志,包含了读取粒子数据、灯光计算和渲染计算总共花费了大约17.5秒:
PRG: Rendering
frame 100
STS: Section "Retrieving Particles":
STS: Total
00h00m 05.000s Called 1 times Avg 00h 00m
05.000s
PRG: Rendering 10000000 particles.
PRG: Producing volumetric lighting with 1 lights
STS: Section "Lighting:Matte Objects":
STS: Total
00h00m 00.000s Called 1 times Avg 00h 00m
00.000s
STS: Section "Lighting:Sorting Particles":
STS: Total
00h00m 01.312s Called 1 times Avg 00h 00m
01.312s
STS: Section "Lighting:Generating Attenuation":
STS: Total
00h00m 06.110s Called 1 times Avg 00h 00m
06.110s
STS: Section "Render:Matte Objects":
STS: Total
00h00m 00.016s Called 1 times Avg 00h 00m
00.016s
STS: Section "Render:Sorting Particles":
STS: Total
00h00m 01.203s Called 1 times Avg 00h 00m
01.203s
STS: Section "Render:Drawing Particles":
STS: Total
00h00m 03.969s Called 1 times Avg 00h 00m
03.969s
PRG: Finished rendering frame: 100
1.5 输出分辨率对粒子渲染效果的影响
§ 当使用粒子渲染模式(与体素渲染模式相对)来进行渲染时,请记住:输出分辨率会影响到最终渲染结果,影响程度几乎可以比肩粒子数量对最终渲染结果的影响。
§ 当输出分辨率改变时,同时也改变了真实世界中每像素所占的空间大小。
§ 这就意味着在一个较低的分辨率图像中,一个像素代表了一个更大的体积空间,因此也意味着在单位体积内包含了更多的粒子,这样就会降低渲染的颗粒感,并使渲染出来的粒子看起来更紧密充实。
§ 提高分辨率会使粒子分布变稀疏,因此需要更多的粒子才能覆盖画面中(原有画面比例的)像素区域去得到流畅光滑的渲染结果。
§ 下图中,Iterative模式的下的缩放特性被用于减少输出的分辨率到原来的50%,但粒子的密度并没有发生改变。
§ 左边的图是0.005的密度,1000w粒子,右边的图是0.05密度,100w粒子。
§ 能观察到,右边的图在100%分辨率的情况下看起来非常粗糙有颗粒感(见本文之前的100%测试大图),但缩小50%之后看起来像是1000w粒子在100%分辨率时候的效果,而左边的图像看起来就光滑的很完美了。
1.6 1000w粒子的体素渲染测试及结论
§ 使用比一个像素稍微大一点儿的体素来进行渲染会得到较少颗粒感的结果,这是因为所有的体素都一个一个地邻接在一起,因此没有空的体素在他们之间,这会导致更光滑的过渡。
§ 此外,体素渲染模式下的Filter
Radius参数能够使相邻体素的衔接更为光滑,因为它在着色的时候会把自身体积外的粒子也考虑进来(进行过渡着色),但是Filter
Radius的代价就是渲染时间,值越大渲染时间越长。
§ 下面的图片是10个partitions,密度0.05,使用不同的Voxel
Sizes和Fiter Radius参数组合的结果:

A:Voxel Size 0.5 ,Filter Radius
1,这个效果与之前同数量的粒子渲染模式的效果类似

B:Voxel Size 0.5 ,Filter Radius 2,抹去了一些噪点

C:Voxel Size 1 ,Filter Radius 1,和B图很相似

D:Voxel Size 1 ,Filter Radius
2,产生了过度模糊的图像
点击阅读下半部分:《如何减少Krakatoa粒子渲染的颗粒感(下)》