【Water Drop系列】3b – Physically based wet surfaces

【Water Drop系列】是雨效渲染实现的整套方案的翻译总结,本文是第五篇,主要介绍降水对材质的影响以及在PBR管线中如何去实现以及优化表现。这里是原文链接

上一篇文章介绍了两种用于模拟潮湿地表BRDF的实现方法,这两种方法均没有考虑IBL的影响,且其实现消耗距离在游戏中实时使用还有很长一段路要走。

在CG领域,还有另外一种不需要修改lighting模型就能实现干燥地表到潮湿地表的动态过渡效果的方法。其实只需要使用一个相同的BRDF,之后分别采集干燥情况跟潮湿情况下的参数,之后在两种参数之间进行差值即可。

不过这种方法却受限于潮湿材质与其上层水面的次表面散射效果的实现,比如潮湿表面的漫反射以及高光反射等参数,使得上一篇文章所介绍的双层BRDF的实现存在困难。

这种插值BRDF模型的优点是实现简单,渲染指令少,且能够跟任何类型的光照相兼容。缺点在于需要使用两套BRDF参数,会增加编辑与存储的时间,且需要两套贴图。。

编辑与保存都用两套贴图的方式太不方便,因此这里尝试使用相同的光照模型来表示干燥与潮湿表面的效果,使用单独的一套干燥表面的参数推导出潮湿地表的参数。

使用这种从一套参数推导另一套参数的方法的游戏有很多:迷失地带,神海2/3,刺客信条3,孤岛危机2/3,合金装备5等。

这种结果并不是不能理解,因为这种方法很简单,且能够跟延迟渲染管线很好的契合:只需要在GBuffer中调整BRDF的参数即可,都不需要修正光照系统的实现。

不过,这些游戏推导出来的潮湿表面的BRDF参数不是有问题就是太粗糙,虽然视觉效果看起来还不错,但是从物理的角度来看,是不能令人信服的。他们大多使用相同的眼睛标定的参数来对diffuse&specular进行减暗与加强,且这个过程对于所有的材质都是相同的,完全没有考虑材质本身的属性。

刺客信条的实现方式还有另外一点令人诟病的,根据雨的种类来对上述参数的数值进行调整。

因为,在上一篇文章中讲过,不管在那种雨的作用下,多孔表面都会被雨水所饱和,这种效果仅仅决定于降水量,而跟雨种类无关。

古墓丽影在diffuse上的做法有一点不同,他们引入了一种叫做“暗光”的光源,用于对表面所接受到的正常光源的diffuse进行减暗处理。他们会使用一个光照预处理pass来计算雨效的光照,猜测是为了弥补GBuffer中所缺失的漫反射参数,不过这种做法就会错误的将相同的修正后的参数因子应用到所有的干燥表面上,跟前面的问题如出一辙。

本文接下来的部分会介绍从干燥表面BRDF参数中推导潮湿表面BRDF参数的加强版方法,在这个过程中会突出展示使用PBR的好处。首先会介绍多孔绝缘表面的diffuse&specular参数推导方式,之后会扩展到其他材质上,最后会以物体表面纤薄层水面效果以及浓厚层水面效果展示来结束。

Porous dielectric material

首先声明,此处的颜色值都是线性空间的而非sRGB空间的,所有的图表文末都有对应的mathematica文件。

当前的目的是找到一个作用在干燥diffuse参数上的变量,使得施加了此变量的影响之后的效果等价于潮湿表面的表现,首先介绍一下前人在绝缘材质上的一些工作。

Nakamae在驾驶模拟器中对于沥青材质使用一个[0.1,0.3]范围之间的参数对diffuse的基色进行减弱,并使用一个[5,10]之间的参数对specular进行增强。这种方式是一种经验式的处理,并没有考虑物体表面的属性。

参考文献[3],[16]给出了前文用于解释材质基色在受水变暗的两套光学理论,出于对描述方便,将[3]中的模型用LD表示,而[16]中的模型则用TBM表示。

有一点需要提前说明的是,本文中说到的albedo基色,跟图形学中的diffuse albedo并不是一个概念,图形学中的概念指的是完美lambertian表面的漫反射颜色,而此处的albedo则包含了部分高光反射。

上述两种模型都给出了干燥albedo跟潮湿albedo之间的关系,并指出了同一种材质在两种不同状况(潮湿与干燥)下的albedo的差值最大出现在材质的干燥albedo位于中间位置的时候。即干燥albedo过大或者过小,受水影响的幅度就越小。

阴暗材质表面本身吸光强度高,即使上面施加了水面,大部分的光线依然会被吸收掉,使得水面潮湿的表现不够强烈。高光反射表面大部分的光线都被反射了,添加了水面之后,相对于水面层内部的反射,反射到外部的光线占据着大头,使得水面的影响也不是很明显。

在上面两种情况中,干燥与潮湿情况下的albedo只取决于表面的IOR,即水的折射系数与干燥材质的折射系数。下图中蓝色线条是在干燥IOR=1.5(通常情况下的数值),水面IOR取1.33时,潮湿情况下的albedo相对于干燥情况下的albedo的变化曲线,取用的是[3]中的TD模型,红色线条则是干燥albedo的变化曲线。

将上述曲线转换一下表现形式,绘制潮湿albedo除以干燥albedo函数曲线图,得到下述结果。这个公式输出的就是应用到干燥abledo上的缩放因子。

给出的结果说明了潮湿albedo曲线是非线性变化的,且在干燥albedo较小的时候,水面对其造成的减暗效果要强于干燥albedo较高的情况。另外,由于潮湿albedo随着干燥albedo的变化曲线是跟波长有关的,因此在添加了水面层后,会导致材质的饱和度变高。

以干燥albedo值为0.12为例,使用第二条曲线,对应的除法系数为0.68,此时对应的潮湿albedo为0.08.

对于干燥albedo值极低的情况(小于0.039),可能会导致第二条曲线的数值高于1(即使得受水面叠加后,材质的亮度不减反增,这个数值在图中未绘制出来),出现这个表现可能是因为水面的垂直入射时候的albedo为0.02,在朝向与水质变化时,这个系数还有可能进一步增加,而这个albedo值是高于这些低albedo的材质的,因此在叠加水面之后反而使得表面更为明亮。

如参考文献[4]中所述,反向操作,如通过潮湿表面的albedo参数倒推干燥表面的albedo系数也是可以的。

关于LD模型跟TBM模型的一些区别。这两种模型都没有做过多的测量工作。虽然这两个模型非常的接近,但是还是有一些区别的,聚焦点不一样:[3]关注的是粗糙的固体表面,比如黑板,沥青混凝土之类;[16]比较适用于均匀分布的一些细微模型组成的材质表面,比如沙滩表面。本文作者担心仅仅依赖于albedo跟IOR参数可能不足以表达潮湿albedo跟干燥albedo之间的关系,就像前面介绍的孔洞参数恐怕就没有被考虑进去。除此之外的其他模型,恐怕也有相同的问题。[17]就指出说TD跟TBM模型无法表述所有的测量细节。这里给出六种自然沉淀物的干燥/潮湿表面关系图。LD模型模拟结果给出的是黑色的实现,TMB模型模拟给出的结果是虚线,剩下的是测量结果:

参考文献[17]如本文前文所述,指出了至少还需要加入两个参数:透明粒子的含量占比(石英类粒子会有较低的吸收系数与较低的内部散射)以及微笑粗糙度。半透粒子聚集程度增加时,会导致干燥albedo与潮湿albedo之间的差值增大。另外,粗糙表面会使得散射光线中diffuse部分增加,且当添加一层水面之后,在以较大角度从水面入射向空气时,会加大内部反射比例,导致表面的亮度降低得更为明显。因此LD*TBM模型是不足够的。总的来说,应该需要一个参数来将diffuse跟specular部分分割开,但是此处的输出结果albedo却将两者包含在一起了,只给出了一些模糊的数据说明:在LD模型中,diffuse因子一般是大于0.68的。

参考文献[5][8]搜集了现实世界中干燥材质与潮湿材质的一些测量结果。[8]给出了几种不同材质的从干燥到潮湿的变化过程,其中提供了不同角度以及不同光线条件下,不同时间段的测量数值。为了能够在渲染的时候更好的控制与调整从测量结果中得到的相关参数,[8]还将测量的BRDF转变为Torrance-Sparrow BRDF中的参数。简单的来说,他们给出的工作已经能够产生我们所需要的PBR的diffuse部分以及由粗糙度+高光反射系数组成的specular部分。

从[8]中提供的数据库中可以拿到diffuse/specular/roughness等参数对应的贴图数据。文作者从[8]数据库贴图中提取了一些本文计算所需要的信息:diffuse贴图在完全干燥与完全湿润条件下的结果;干燥albedo与潮湿albedo的两张关系图。黑线是干燥albedo的参考线。此外,还绘制了albedo图像的直方图曲线,以及粗糙度sigma的直方图曲线。在处理的时候为了避免噪声的干扰,只会对同时在贴图中出现十次以上的albedo数值进行计算,另外还有一些其他的数据提取细节,不再赘述。

上述数据库中的所有数据都是粗糙绝缘体材质的。这里需要说明的是,并没有一套标准的映射模式,受水面影响变暗的过程是跟颜色通道相关的,即不同的颜色通道,变暗的方式不一样。且相对于LD/TBM模型中的漫反射albedo而言,亮度会偏高一点,这是因为没有通过除以Pi来进行归一化的原因。

另外,diffuse factors相对而言也更高,大概在[0.2, 1.0]范围中。之所以会出现这个表现,可能原因在于拟合过程:比如没有考虑高光,比如图像采集设备的标定等。

对于比较低的干燥albedo(除以Pi之后大概为0.02),在受水面影响后的效果表现与LD/TBM模型的预测比较一致,即变亮。另外,部分材质可以通过简单的RGB缩放来实现干燥albedo到潮湿albedo的过渡,不过不同材质之间的scaling因子可能不一样。

材质之间的比对在wet/dry albedo比例曲线大部分数据是一致的前提下才有意义,不过对于砖块等材质而言,在期望值附近有一个较大的标准差,而其他材质的标准差则较小,因此在数据库中的结果中并没有看到如LD/TBM模型中清晰的关联模型。

前面说过,受水面变暗的表现跟材质的粗糙度有关,不过即使具有相同的粗糙度的材质,其表现也是有所区别,这个就是因为孔洞度的原因。

为了分析高光反射因子与漫反射因子之间的关系,这里给出了几张不同的关系图。

在这个模型中,Ks跟粗糙度是解耦的(跟现代的归一化的高光计算模型不同)。对于粗糙度而言,粗糙度越低,高光应该就越高。期待的结果为Ks wet/ Ks dry高于1,而sigma wet / sigma dry低于1,不过从测量结果来看,并不是所有时候都满足这个预期的。

结果中部分材质的表现符合预期,但也有部分材质的表现比较反常,在潮湿情况下高光不增反降。

从Ks、sigma的曲线走势来看,这两者中至少有一个跟Kd的走势保持一致,这就让我们想到了前面一篇文章提到的潮湿孔洞材质的BRDF,在这个BRDF中,漫反射孔洞部分在受水覆盖的时候会转变成高光水面光照效果。如果是这种情况的话,那么就应该将factor用来减暗diffuse,以达到调整高光的目的。

这个数据库只提供了某种材质的相关数据,但是这些数据是没有空间分布规律的,即没有一个在贴图上不同位置的具体变化规律,这里通过对数据进行仔细比对来进行分析:

这些数据是用Oran-Nayar方法而非lambertian BRDF拟合的,这里给出的数据中diffuse color会存在高于1的情况,sigma数值也会出现不可用的情况,这是因为使用的解析BRDF拟合方法存在问题的原因

本文作者对这个数据库的看法是,缺失了表明干燥表面跟潮湿表面关联的一些重要数据。从拟合数据推导出来的粗糙度数据不是很精准,且拟合的时候应该将高光数据进行归一化。

从前面的讨论中知道,低albedo的粗糙多孔材质在受潮之后效果变化会显著一点,而如果用一个接近于LD/TBM的曲线来拟合所有变量的变化过程会非常的耗。这里会依然坚持使用单色的参数来减少存储量(在很多情况下其实已经足够),此外会放弃对albedo的变量控制,因为即使用最简单的方式,加上albedo也会需要很多的指令才能完成。且如果渲染的时候遵循的是严格的PBR的话,不会因为albedo变量的缺失而产生严重的影响。

前面讲到,粗糙度跟孔洞度是微几何表面的两个不可见的特征。而在部分材质中,这两者是存在关联关系的,不够这种关联关系不能推导到所有的材质上。如果为孔洞度单独配置一个变量参数进行控制的话,成本太高,因此这里就从直观的感觉上来给粗糙度跟孔洞度施加一个假定的关联关系。下面会对这种做法给出一个详细的说明,并给出实施的一些建议,以满足美术同学与性能表现的平衡。

在这种情况下,可以使用孔洞贴图来表征材质的孔洞情况。孔洞贴图可以放在任意低分辨率贴图中的未使用通道中。孔洞贴图是一个灰度贴图,其中0表示无孔洞,1表示最高强度孔洞。不过这种做法并不是PBR的,因为这里并没有使用孔洞BRDF,这里的孔洞参数对应的其实是从干燥albedo到潮湿albedo的变换关系,因此这张贴图通常是美术同学直接制作的,最好是参照干燥贴图与潮湿贴图来输出一一对应的孔洞度参数,不过因为本身就是因为无法同时取得这两种贴图才引入了孔洞贴图,因此这种做法是不可行的。另一种方法则是从光滑度贴图着手,移除其中光滑的部分,将剩余粗糙的部分进行模糊,就可以用来模拟孔洞贴图了。需要注意的是,孔洞贴图跟光滑度贴图一样,也是会存在一些pattern的。此外,如果想要实现更为物理的效果,比如随着时间变化或者随着天气而变化,可以对孔洞贴图进行线性映射。

这里计算使用的是利用一个diffuse减暗因子来对干燥贴图进行处理,并用这个因子来提亮specular。关于specular,在使用一个PBR的BRDF的时候,只需要修正光滑度参数即可完成。使用光滑度作为索引的预计算卷积cubemap chain可以实现水面反射度的自动调节。不过需要注意的是,水面饱和度变化导致的水面高光颜色的变化在游戏中并不是很明显。

使用上述方法来修正DoWetProcess函数:

void DoWetProcess(inout float3 Diffuse, inout float Gloss, float WetLevel, float2 uv)
{
float Porosity = tex2D(GreyTextures, uv).g;
   // Calc diffuse factor
   float factor = lerp(1, 0.2, Porosity);

   // Water influence on material BRDF
   Diffuse    *= lerp(1.0, factor, WetLevel); // Attenuate diffuse
   Gloss      = lerp(1.0, Gloss, lerp(1, factor, 0.5 * WetLevel));
}

首先计算出diffuse减暗因子,这一步通过lerp完成。1.0表示无作用,0.2表示最大减暗程度,减暗过程根据孔洞度得到。在这个过程中,实际上是有光滑度的参与的,因为孔洞度的计算就使用了光滑度贴图,只是这里并没有显示的使用光滑度参数。0.2的参数参考了文献[8]跟文献[2]。得到减暗因子之后,将之应用到干燥albedo上,就能得到潮湿albedo的结果。另外,增加了根据WetLevel的过渡来得到平滑的变化过程。之后将这个因子用于对材质的光滑度以及水面的光滑度进行加权平均,因为水面光滑度是完全光滑的,因此直接赋值1.0。另外,这里还对WetLevel进行了0.5的上限,是为了避免高光过曝的问题。当然,这个公式跟实现是纯经验式的。下面是使用不同参数的结果展示:

这里给出另一种实现方法。

在实际开发过程中发现,为每种材质都增加一个孔洞贴图的成本也非常的高,因此在这种情况中考虑根据孔洞参数跟粗糙度参数之间的关系来给出一种近似的粗糙解法。首先根据光滑度贴图生成一张孔洞贴图mask。这个mask用于控制孔洞参数的强度。之后用这个mask,美术同学就可以控制材质在受水之后的表现了。本文作者将孔洞mask存储在specular贴图的alpha通道中,并使用DXT1a来进行压缩。

float Porosity = tex2D(specular_texture, uv).a * saturate(((1-Gloss) - 0.5)) / 0.4 );
// Calc diffuse factor
float factor = lerp(1, 0.2, Porosity);

光滑度贴图只会在数据是粗糙的情况下才会对孔洞参数造成影响,且随着粗糙度的降低,其影响程度也是线性降低的。因此这里使用一个公式((1-Gloss) – Start) / (Start – End)来根据光滑度进行孔洞参数映射。Start跟End参数取决于光滑度的约定以及引擎所支持的光滑度范围。通常来说,Start可以看成是在光滑度达到多少的时候表面可以看成是光滑的,而End则是对应于完全粗糙的情况下的光滑度。在这里,对于光滑度范围在1~2048的情况下,1表示完全光滑。下面左图中对应的是上面代码的结果,右图对应的则是从光滑度到高光指数转换曲线。

其中Start取值0.5,表示specular指数为45,End取值0.1,对应的指数为2.最终的结果可以写成:saturate(-2.5 * Gloss + 1.25).

不使用孔洞参数的情况下,就只能根据光滑度参数来按照上面的remap公式进行更为粗糙的估计。美术同学对于这种情况是没有办法控制的(这会导致一些粗糙的无孔洞的材质比如皮革在受水的时候出现变暗的情况,这跟现实世界的表现是不一致的),虽然如此,相对于其他游戏中将减暗效果用在任何材质(不论是否粗糙)上的做法已经算是有很大提高的。

float porosity = saturate(((1-Gloss) - 0.5)) / 0.4 );
// Calc diffuse factor
float factor = lerp(1, 0.2, Porosity);

Metallic and smooth material

前文说过,孔洞、粗糙材质上存在一种次表面散射,使得表面反射效果被减暗。这种次表面散射在金属以及光滑材质上是不存在的。现实世界中有一些手工制作的粉末状金属材质也是带孔的,不过这里不考虑这种情况。因此,关于这种次表面散射,我们唯一需要做的工作就是不去理会。这是因为,在前面的工作中我们已经使用光滑度贴图来产生孔洞度参数的方式来对光滑材质加以考虑了,这里唯一需要处理的就是金属材质对公式的影响。

float factor = lerp(1, 0.2, (1 - Metalness) * Porosity);

新的公式如上所示。对于金属材质而言,金属度为1,非金属材质的金属度为0.在前面说到的用一张灰度贴图来存储孔洞度参数,金属度可以直接嵌入到这张贴图中。怎么做?在光照模型中使用基于物理的参数的话,如果材质中没有金属度参数,就需要从高光参数(IOR)中将之移除。实际上,金属材质会有较高的高光参数,因此可以使用如下的简单公式计算金属度:

// dot, mad_sat
float Metalness = saturate((dot(specular, 0.33) * 1000 - 500) )

点乘可以处理类似黄金材质(1, 0.76, 0.33)的情况。不过需要注意的是,这种做法会移除掉前面提到的水面对于低层材质的高光反射的提亮作用,而这个作用在这种被薄薄的水面层覆盖后的情况下主要来源于水面,是必要的。

Thin layer of water and puddles

对于被水面浸透的孔洞材质,以及金属和光滑材质,在表面上叠加一层水面之后的效果就不能通过对BRDF的参数进行变换来模拟了,而是需要使用双层BRDF才行。不过,双层BRDF的实现代价太高了。Jensen使用了另一种模拟方法:实现了一套次表面散射模型,并在上面添加一层水面。这种方法是基于以下的观测结果而给出的,即材质内部的液体(水)对于材质的影响更为明显。材质受水之后的次表面散射是导致材质变暗的最主要原因,且在次表面的作用下,薄薄的材质如纸张在浸透水之后会变得透明。因此,对于粗糙多孔的材质,双层BRDF实际上并不是很需要。而对于光滑的金属的材质,水面的吸收,折射以及全反射在薄薄的水面覆盖之下其实也不是那么重要,不过,这并不意味着可以什么都不做。

前面曾经采用在法线贴图跟水面法线之间做过渡来模拟水坑的方法,这里也可以使用这种方法来实现薄薄的水面层的模拟:

在浅水层的情况下,依然需要为水面底部的表面计算反射,而对于深水层,则可直接使用水面的光滑法线来计算镜面反射效果。因此可以使用一种在法线贴图跟顶点法线之间渐进式过渡的方式来实现水面深浅过渡模拟。

这里的实现代码跟前文一致,这里就不给出了。只需要用前面章节中用于基于物理的潮湿表面渲染近似方程替换DoWetProcess函数即可。AccumulatedWater参数可以用于模拟浅水层跟深水层。而通过调节表面高度图或者顶点颜色,就可以实现对水面深浅的修正。

这里的实现代码跟前文一致,这里就不给出了。只需要用前面章节中用于基于物理的潮湿表面渲染近似方程替换DoWetProcess函数即可。AccumulatedWater参数可以用于模拟浅水层跟深水层。而通过调节表面高度图或者顶点颜色,就可以实现对水面深浅的修正。

这套方案在各种设备上的性能表现都很不错。
这里值得一提的是,对于静态天气而言,效果实现只用到了本文中所陈述的内容中的一小部分,降雨量是静态的,只需要使用一张预处理的贴图即可实现,这样可以保证美术同学对于效果以及性能有最高的控制力,这也是游戏中的第一准则。

对于水坑以及浅水层叠加的情况的模拟,也有人[20]给出了一套近似的系统:
在水面层较浅的情况下,水面法线可以直接使用低层沥青的法线,在水面层较深的情况下,水面才会变得平滑。因此可以在二者之间进行插值来实现过渡模拟。

这里还尝试过通过光谱来实验水面潮湿过程。[6]中指出干燥石头跟潮湿石头之间的反射颜色的区别,经过实测表明只是一个简单的颜色偏移(参考上一篇文章)。而在[21][22]中,干燥材质跟潮湿材质的区别则不只是色相偏移,还包含了跟水材质光谱的混合。下面给出的是碳酸盐化合物沉淀的干燥过程的光谱变化。

作者曾经尝试过使用Matt Pharr[23]的Pbrt代码来通过色相偏移与lerp的方式从干燥贴图生成一张潮湿diffuse贴图。下面的贴图对应的分别是原始贴图,0.4lerp后的贴图,0.1shift后的贴图,以及0.05shift+0.025lerp后的贴图结果。

从结果上看,lerp会导致结果变得灰色,而shift虽然只给了较小的权重,但是却实现了希望看到的色度偏移,这就是为什么需要尝试lerp+shift方式的原因。不过最后给出的结果其实不是特别好,不过后面没有对参数进行进一步的修正来提升效果。不过这种方式应该是值得尝试的。此外,从RGB转换到光谱空间依然是一个难以解决的问题,因此给出的结果永远都是由偏差的。

原文给出了实现代码。

Wetting/Drying

如果要处理降雨的动态变化效果,就需要对地面干燥以及潮湿的过程有一个了解。

干燥的过程其实比想象的要复杂,下面给出了一些干燥过程中的图片,可以看到其实并没有固定的pattern。

此外,潮湿的表面还呈现出一种随着空间位置的不同而变化的反射。在干燥过程中,specular会小时,但是diffuse还依然维持着比干燥情况更暗的表现。

参考文献[6]中有更详细的研究。表面上各处干燥的速度取决于几何体的形状。整个干燥过程还跟外界的辐射(比如阳光,空气温度,火源),空气流动,重力以及流体梯度等也存在关系。[6]通过恒定上述各项变量中的大部分来对干燥过程进行研究,下面图片中的第一排给出的是干燥中的表面,而第二排给出的是specular反射。

参考文献[8]也进行过相似的研究,下面给出的是木材随时间而变化的过程:

上面的两个实验都是在材质表面上没有叠加深水层的情况下进行的。可以观察到,最开始的高光反射是比较强的,之后随着距离潮湿区域的边远而逐渐减弱。其中潮湿表面的高光反射消失的速度比潮湿diffuse消失的速度要快很多。[8]给出的解释是,高光反射消失的速度是呈指数级别的,且随着时间的变化,潮湿边缘会逐渐变得模糊。参考文献[8]通过触达性(凸出区域比凹陷区域干得更快)以及到边缘的距离作为控制参数来模拟干燥的过程。不同的空间区域根据上面给出的参数不同,其干燥的过程也有所不同。总的来说,干燥时间函数可以拟合成一个sigmoid函数(S型函数),下面是曲线拟合的结果:

参考文献[8]中将测量后的数据用两张贴图:下图左边的是干燥程度贴图,右图则是干燥偏移(即起始偏移数值)贴图。来表征不同质的干燥速度。

参考文献[5]给出了一个公式,用于模拟地表albedo随着潮湿程度的变化

alpha(t)是S型曲线,公式中的dry-wet参数对应的是完全干燥或者完全潮湿情况下的albedo

在游戏制作中使用的方法比这个要简单一点,不会使用S型曲线而是使用一张普通的噪声mask贴图或者一个简单的lerp函数来实现过渡。

前面说过,如果玩家对于效果的变化关系不是特别关注的话,那么实现效果的变化过程是没有必要的。如果按照真实世界的时间比例来计算,那么表面干燥的过程大概会需要花费30分钟以上,对于一个游戏而言,玩家停留一个位置长达30分钟是不可想象的。因此在制作中,可以简单的使用lerp来实现过渡,而不需要考虑specular的指数衰减过程。另外,对于表面上有着一层积水的情况,还需要另外考虑,这种情况下水面干涸的速度比前面说的潮湿表面的干燥速度要慢很多。

而对于无孔表面而言,是没有所有的干燥过程的,表面上的水会逐渐蒸发,直至一丝不剩。

相对于干燥过程而言,潮湿的过程则有所不同,通常都是瞬时完成的。最终受水之后的效果取决于接收到的水的体积。效果区别主要包括饱和度以及表面上的积水厚度。在这个问题上,目前没有太多前人的工作。

这里给出了一个dynamic paint的演示视频,可以用于制作dynamic wet map以实现干燥、潮湿状态的切换。

[10]给出了孔洞材质受水之后的流体模拟。

参考文献[5]给出了能够拟合Torrance-Sparrow以及Oren-Nayar BRDF的一些数据(跟前文说到的一样,没有空间层面的变化)。下面给出这些数据随着时间变化的图形化表示(横轴给出的是采样点,跟时间还有一点区别。)。

Conclusion

本文给出了潮湿地表diffuse变暗以及specular变亮的内部原因分析,并介绍了很多先进的实现方法,但是这些方法都是模拟逼近,而无法达到完全真实的效果。实际上,在游戏中,出于对性能的考虑,也不需要使用过于复杂的方法。因此,本文给出的实现方法为通过调整PBR-BRDF的参数来实现干燥与潮湿的切换与过渡。这里就必须要强调基于物理的BRDF的好处了。主要观点包括以下内容:

    * 潮湿表面的颜色变化是由于两种光学现象导致的
    * 受水之后会导致饱和度的增强,色相的偏移以及diffuse亮度的下降和光滑表面specular亮度的增强
    * 孔洞材质才会受雨水的影响
    * 给出了复杂光照模型是如何使用双层或者孔洞BRDF来处理潮湿表面情况的
    * 给出了一些使用调整BRDF参数的方式来简单模拟潮湿表面表现的方法
    * PBR参数有利于直观的模拟潮湿表面
    * 孔洞参数可以用于控制天气变化以及时间变化情况下的表面潮湿度。
    * 干燥过程是一个S型曲线函数,且整个过程是非同质化的,相对于diffuse的变化速度,specular的消失速度要快得多。

总的来说,本文给出了当前材质测量中的一些缺陷:缺少了一些关于材质粗糙度与孔洞度的数据;潮湿表面高光提亮数据的关注度也有所不足;还有一些在潮湿情况下的效果没有被考虑进来:材质

Reference

[1] Jensen, Legakis, Dorsey, “Rendering of Wet Materials”, http://graphics.cs.yale.edu/julie/pubs/Wet.pdf

[2] Nakamae, Kaneda, Okamoto, Nishita, “A Lighting Model Aiming at Drive Simulators”, http://dl.acm.org/citation.cfm?id=97922

[3] Lekner, Dorf, “Why some things are darker when wet”, https://www.victoria.ac.nz/scps/about/staff/pdf/darkerwhenwet.pdf

[4] Mall, Lobo, “Determining wet surfaces from dry”, http://www.vision.eecs.ucf.edu/papers/wet_dry_iccv.pdf

[5] Sun, Sunkavalli, Ramamoorthi, Belhumeur, Nayar, “Time-Varying BRDFs”, http://www.cs.columbia.edu/~belhumeur/journal/tbrdf-tvcg07.pdf

[6] Lu, Georghiades, Rushmeier, Dorsey, Xu, “Synthesis of Material Drying History: Phenomenon Modeling, Transferring and Rendering”, http://graphics.cs.yale.edu/julie/pubs/Drying.pdf

[7] Blevins, “Wet Looking Materials “, http://www.neilblevins.com/cg_education/wet_materials/wet_materials.htm

[8] Gu, Tu, Ramamoorthi, Belhumeur, Matusik, Nayar, “Time-Varying Surface Appearance: Acquisition, Modeling and Rendering”, http://www.cs.berkeley.edu/~ravir/papers/tsvbrdf/

[9] Hämäläinen, “Blender dynamic paint guide”, http://www.miikahweb.com/en/articles/dynamic-paint-guide

[10] Lenaerts, Adams, Dutré, “Porous Flow in Particle-Based Fluid Simulations”, http://graphics.cs.kuleuven.be/publications/PFPBFS/PorousFlow.pdf

[11] Mérillou, Mérillou, Ghazanfarpour, Dischler, Galin, “Simulating Atmospheric Pollution Weathering on Buildings”, http://liris.cnrs.fr/~egalin/Pdf/2010-atmospheric-weathering.pdf

[12] Lobanchikov, Gruen, “GSC Game World‘s S.T.A.L.K.E.R : Clear Sky –a showcase for Direct3D 10.0/1″ http://developer.amd.com/gpu_assets/01GDC09AD3DDStalkerClearSky210309.ppt

[13] St-Amour, “Rendering Assassin’s Creed 3”

[14] Lacroix, “Casting a new light on a familiar face”, https://drive.google.com/folderview?id=0B2iEzxzGlkkZWXNrOURDcFJXbzg&usp=sharing

[15] Kojima, “Metal Gear Solid V: The Phantom Pain”, http://www.gamespot.com/metal-gear-solid-v-the-phantom-pain/videos/hideo-kojima-gdc-2013-panel-6406092/

[16] Twomey, Bohren, Mergenthaler, “Reflectance and albedo differences between wet and dry surfaces”, Applied Optics

[17] Zhang, J.Voss, “Bidirectional reflectance study on dry, wet, and submerged particulate layers: effects of pore liquid refractive index and translucent particle concentrations”, http://www.opticsinfobase.org/ao/abstract.cfm?uri=ao-45-34-8753

[18] McCauley, “Calibrating lighting and materials in far cry 3”, http://blog.stevemcauley.com/2012/09/09/calibrating-lighting-and-materials-in-far-cry-3/

[19] Rebollo, Hogert, Albano, Raffo, Gaggioli, “Correlation between roughness and porosity in rocks”, http://www.sciencedirect.com/science/article/pii/0030399295000518

[20] Pesce,”impossible is approximately possible”, http://c0de517e.blogspot.fr/2008/10/impossible-is-approximatively-possible.html

[21] Balsam, Deaton, Damuth, “The effects of water content on diffuse reflectance spectrophotometry studies of deep-sea sediment cores”, http://www.ig.utexas.edu/people/staff/damuth/reprints/spectrastudy_watercontent.pdf

[22] Philpot, “Spectral reflectance of wetted soils”, http://www.asdi.com/getmedia/eeeb7ad1-c964-44fd-9404-d4870657e738/Spectral-Reflectance-of-Wetted-Soils.pdf.aspx

[23] http://www.pbrt.org/

你可能感兴趣的:(【Water Drop系列】3b – Physically based wet surfaces)