【Water Drop系列】是雨效渲染实现的整套方案的翻译总结,本文是第六篇,主要介绍潮湿地表的反射现象。这里是原文链接
潮湿地表会使得平时不可见的反射现象变得更明显。光照效果分为自发光,直接光跟间接光。直接光跟间接光都是反射得来,如果在计算的时候使用的是最真实的PBR计算方法,那么这里就不需要额外对反射进行其他的处理了。
在作者开发的《Remember Me》游戏中,就准备将反射计算放在任何表面上,而非局限于日常常见的光滑表面水面等。
Reflection – Theory
下面先给出反射的一些现实效果
Reflection with smooth surfaces
先看下光滑表面的反射效果,看起来就像是将正常的场景倒转过来绘制一样

不过实际上,这个假设是不正确的,其实反射不仅取决于被反射物体到水面的距离,同时还取决于观察的位置与角度。

观察者距离反射表面越近,且被反射的物体距离反射表面越远,什么东西区别就越小。下图中,当观察方向接近水平时,米老鼠就被前面的玩偶所遮挡而没有产生投影。



Stretched reflection with rough surfaces
glitter path现象通常是由光源,比如说太阳,发出的光被动荡的光滑表面,比如浮动的波浪所反射而导致的。

用示意图的方式来模拟这个现象,根据反射光路走势图,想要人眼能够观察到反射光照,就需要满足出射光线跟入射光线,相对表面法线而言是对称的。

当波浪整体上存在多个点满足这个条件时,就出现了glitter。
总的来说,需要满足一些条件:1.表面整体需要满足一个规律,比如大体平整;2.表面上的微表面细节也需要满足某个条件,这个通常可以用粗糙度来表征。粗糙度表示的是微表面与表面整体形状的差异,差异越大,粗糙度越高,闪光就越分散。波浪浮动的水面可以看成是这样的一个粗糙表面。

水面的这种粗糙度特征是导致水面呈现glitter path的直接原因:
*Glitter的形状通常是椭圆形的,且椭圆的拉长程度取决于光源光照方向与表面切线的夹角。比如说,如果光照方向垂直入射到表面上的话,那么反射光的形状就跟太阳的圆形保持一致,否则光照方向与水平方向越接近,则反射形状越长。这种观测是建立在表面粗糙度均匀的前提下的,但是实际情况确实,由于风力等各种干扰因素的存在,表面粗糙度通常都是各向异性的,这种情况在近海岸区域较为明显。
高光光源而言,glitter形状的角度距离(angular length)约等于最大波浪斜率对应的角度的四倍(见下图)。不管是朝向观察者还是背离观察者的波浪都会产生闪光,从而使得最大波浪斜率的因子被加倍了,因此也会导致反射计算中的角度被加倍。而glitter形状的宽长比则可以由光源elevation角度的正弦给出。如果光源的elevation角度跟观察者的elevation角度一致,那么glitter形状尺寸约等于光源处于无穷远处时的尺寸的一半,而宽长比是不变的。当太阳或者月亮从天空降落的时候,glitter的形状会逐渐变窄,知道宽长比达到一个最小值,这个最小值在elevation角等于最大波浪斜率角的两倍时达到。超过这个角度之后再继续下降,会导致glitter的形状变短直至消失,这是由于阴影的原因导致。*

glitter path还有一个特性,即glitter效果跟观察者所在的位置是相关的,且反射效果都是跟观察者还有光源处于同一个平面内。(从前面的分析知道,反射发生在于水面波动导致局部微表面的法线方向正好处于光照方向与观察方向之间,因此,在存在法线波动的情况下,比如水面,比如潮湿的不平整的地表上,就能够看到反射效果呈现一种被拉长的椭圆形效果)

反射效果其实是不局限于明亮的光源,而是对于所有物体都是生效的,如下图所示。

下图中白色的透明球体以及岸上的行人在水面上的倒影都会呈现一种被拉长的反射效果。

而且,glitter path的效果也不仅局限于水面,前面说到的只要存在法线波动的情况都能复现。如在镜面上洒上一些液体,使得液体位置出现法线波动,之后在镜面上某处放置光源,也能看到这种效果,如下图所示。


这也就证实了前面说过的,只要存在法线波动,也就是粗糙表面,在受水潮湿后,都会出现这种表现。


不论表面的大形状是否平整,都能看到glitter path现象。

完全平整的表面反射,则没有glitter path效果。

此外,在现实中的glitter path效果并不是永远都是对称的,有时候会出现不对称的效果,如下图所示,也就意味着,不是所有的glitter path都是指向观察者的。

由于水面左右侧高度不对称,导致反射效果出现了上述的弯曲。产生这种现象的一个方法是在水面上加入一个长波浪,在长波浪的作用下,水面的微表面反射倾斜度就被重新排布了,从而导致glitter效果的偏移。另外一种产生这个现象的方法则是添加风力,波浪被风吹动之后会导致波浪的倾斜度分布发生变化。
在前面的实验中,如果将镜面做一个角度的倾斜,也可以复现上述的效果。

下图中的地表是不平整的,而是带有一定弯曲度的,所以glitter path也是带着一定的偏移的。

Reflection blurriness with roughness and distance
表面粗糙度,从某种程度上可以看成是表面反射模糊程度的表征。粗糙的表面会使得其反射效果与镜面反射效果存在一个偏差,而偏差的程度取决于粗糙度,如果将表面反射的范围看成一个椎体的话,那么粗糙度越高,椎体的半径越大。

ScratchAPixel网站给出了粗糙度对于反射效果的影响的详细阐述:
下图给出了粗糙度逐渐递增的情况下的反射效果的变化。随着粗糙度增加,反射的锐利程度逐渐递减,单点反射的亮度也逐渐递减。

此外,被反射物体距离反射表面越远,反射效果也会越模糊。在反射表面接近光滑的情况下,这种表现不会很明显,在粗糙反射面的情况下,就会很显著了。

从Guerrila的游戏presentation中的内容很好的解释了这个现象的原因。粗糙度可以用一个椎体来表示反射,从不同的角度来观察粗糙表面的反射现象,就会得到椎体与环境的不同位置的相交区域,因此由于pC0比pC1覆盖了一个更大的环境区域,从而使得其反射的效果也就更模糊。

这就意味着,在均匀粗糙的表面上的反射效果也有可能会比较复杂,因为需要处理距离不同的反射效果的变化。而对于各项异性的粗糙表面,其反射效果会更加的复杂,下图就是在这种材质表面上的反射效果。

红色部分比较锐利,而蓝色部分比较模糊,黑色部分则是横向模糊。
Fresnel and polarized reflection
反射效果是菲尼尔效果的一种,在参考文献[9]中给出了菲涅尔效果的详细的科学的解释,其中还包含了偏振的相关内容。
路边水池中景物的反射效果比实物本身更为锐利,色调也更暖和。镜面反射效果中看到的云彩也比现实中的云彩要好看。
之所以会出现这种情况,是因为反射是经过偏振的光照效果,因此会减弱某些物体的光泽,并加强颜色的饱和度,下面是wiki上关于这一点的解释:
非金属表面的反射会导致入射光线被偏振,且这种偏振效果在Brewster角位置(大概是跟垂直方向夹角为56度)达到顶峰。而由于光的电磁特性,金属表面上的反射不会出现偏振。
偏振片会允许跟反射光偏振方向相垂直的部分光通过,且会导致部分光线被吸收。而吸收特性则会导致反射效果中被反射物体出现glare现象,从而使得这些物体的真实细节被隐藏。
Practical Reflection
后面会讨论反射实现的细节与代码。
Reference
[1] Scratchapixel, “Material Appearance”, http://www.scratchapixel.com/lessons/3d-basic-lessons/lesson-14-interaction-light-matter/material-appearance/
[2] Joachim Schlichting, “The Glitter Path”, http://www.uni-muenster.de/imperia/md/content/fachbereich_physik/didaktik_physik/publikationen/glitter_path.pdf
[3] Shaw, “Glittering Light on Water”, http://www.esrl.noaa.gov/psd/outreach/education/science/glitter/
[4] Lynch, Dearborn, Lock, “Glitter and glints on water”, http://engagedscholarship.csuohio.edu/cgi/viewcontent.cgi?article=1103&context=sciphysics_facpub
[5] Drobot, “Lighting of Killzone: Shadow Fall”, http://www.guerrilla-games.com/publications/
[6] Minnaert, “Light and Color in the Outdoors”, book
[7] Lynch, Livingston, “Color and Light in Nature”, book
[8] Wikipedia, “Polarizing filter”, http://en.wikipedia.org/wiki/Polarizing_filter_%28photography%29
[9] Physics Fundamentals, http://www.stmarysacademy.mb.ca/resource/File/Physics_Fundamentals/Physics_Fundamentals_-_Chapter_26.pdf, page 20