[sig12][PBS]Farcry3的物理光照


使用物理光照的游戏列表里面又多了一个有力的成员--farcry3.

这里主要讲了3个方面:

  • diffuse贴图的矫正
  • 天空盒与sky lighting
  • shading model的选择
why physical?
提到physicallighting时候,一般的官方回答:
  • 真实的光照效果
  • 在多变光照环境下,材质始终表现正确
这里我想补充一点就是,如果不是physicallighting,那么什么样呢?
其实我们只有两个选择,基于真实理论的,或者基于hack,跟着感觉走硬凑的。
真实理论的就是physicallighting。
跟着感觉走硬凑就要面临这样的问题,在一个光照环境下是对的,但是换一个环境就不对了,当然也可能美术和程序都特别牛,经过猛烈的一顿调整之后,在所有情况下都是对的了,那么这个结果就一定是physicallighting的,只不过一个是直接在众多研究者,程序员的基础上直接抵达,一个是经过大量尝试曲线救国。

diffuse贴图的矫正
这里一个概念是albedo:是指在某一个角度上,反射的能量与入射的能量的比值。
这里主要讨论diffuse albedo,标准的diffuse贴图就是描述材质漫反射的一个属性,是不能带有额外的光照信息(也包括shadow,ao。。。)。
但是实际我们去diffuse贴图的时候,基本都是从照片中取出来,这样就不可避免的带有光照信息。
比如说我们要刻画一个乳白色的墙,但是我们在夕阳下的照片是发黄的,这样就没法正确的描述呛得乳白色的特性,同样道理,直接阳光下的过白,有阴影等都影响了diffuse属性的表达。
为了达到光照正确,我们需要对diffuse贴图进行一系列的矫正。
这里farcry3用的方法是:

  • 贴图都是自己拍的照片
  • 拍的时候使用一个叫macbeth color checker,就是图里面的那个调色板
  • 然后使用一个photoshop script来根据调色板的颜色值与标准的颜色值的差别,进而计算出如何进行计算才能将照片中贴图去光照信息。
几个实践中的问题,f
1, arcry3项目组在比较后期的时候才开始做这个事情,那么已经做好的很多贴图并没有通过重新拍照获得,也没有办法,这个时候就看artist的功力了,好的artist可以根据经验,以及已经较好色的texture来把这些图片处理好。
2, 美术对于diffuse albedo难以很好的理解,对于其中的光照信息也不能很好的理解,这里做一个区分,光照信息部分是要调节掉的,但是shadow和ao是可以保留的,尽管最好是能够去掉,但是这部分工作就比较难了,fc3的工具也只是去光照信息。
fc3的矫正工具还有很多可以提高的地方,比如:
  • 处理camera带来的扭曲问题
  • 使用起来也不那么便捷

sky dome与sky lighting
项目初期时候,sky是使用两个贴图来描述的,这里带来两个问题:
  • 只能表现出LDR的信息
  • 没法准确描述出天空亮度上的变化(这个变化是基于物理正确的)
后来fc3使用的天空模型是CIE sky model,

这个模型由一些描述信息(比如描述天空是干净晴朗的,还是比较阴沉的,参数就是上面公示里面的a,b,c,d,e),然后加上角度等,就可以给出非常物理正确,很自然的结果,而且:
  • artist也有相当的控制力
  • 自然的,而且是HDR的
  • 不会有贴图控制的带来的分辨率的问题
SkyLighting

skylighting在现在需要的是更加逼真,也就是有层次,像半晚这样的情况,已经不能用简单的一个颜色来代表。
fc3使用的方法是根据cie sky model来把radiance信息放到一个light probe存成sh系数(2阶),然后放到shader里去使用。
然后可以让artist降低饱和度来是的天光不要那么蓝:



但是中间发生一个问题,就是直接使用cie sky model的时候发现给出的感觉没有照片来的“清澈”,后来发现用作参考的照片普遍使用了polarization filter,效果对比:

(右边是有polarization filter)
这个feature挺酷的,查了一下很有意思,这里多说一下,这里比较全
偏振性是指波的震动方向和传播方向不一致,也就是只有横波才有偏振性。
自然光在经过非金属的反射和折射之后,偏振方向会发生变化,变化和入射的角度有关。
在摄影的时候如果使用偏振镜,就可以滤掉很多设定角度以外的偏振光,那么很多我们不需要的光线就被干掉了,会呈现出更加通透的感觉。
实际的摄影效果果然很棒:

在清晰的了解了这个之后,就在cie sky model基础上加了一个fake的polarize filter--一个artist指定的颜色,这样sky就呈现了偏振镜的效果了。

ShadingModel
fc3早期的光照模型既不能量守恒,也没有fresnel,暴露specular power和intensity给artist,也很不直观。
转向physicallighting之后,在shading model的选择上,fc3并没有和其他的有什么不同,也是microfacet brdf:

但是在性能的优化和追求上,更进一步:
specular power的计算上,选取了cod7里面一样的gloss是[0,1], specular power = pow(2,13*g);
normal distribution function:

fresnel项,一般推荐的是schlick(读成“司库力克”)approximation,这里后面有个文章使用spherical gaussion approximation进行了个优化,两者公式:

visibility使用schlick smith



对于visibility的优化和tri ace的方法很像,使用数学简化,然后曲线逼近,最后变成:(2*specPower+1)/8。

SpecularFilter
在使用physicallighting的时候,一个问题就是远处的specular lighting有闪烁的情况。
造成这个问题的一个原因就是用于计算的gloss值没有根据材质离得远的时候,normal的方差变化,那么specular power也应该有相应的变化。
这个方面已经有一些研究,比如LEAN和CLEAN mapping,来解决这个问题,但是消耗比较大。
fc3使用的方法是toksvig map,它是使用normal的方差和gloss来重新估算specular power:

m:原先的specular power,Na:normal的方差。
这样修改texture exporter,可以在各个mipmap里面对gloss进行相应的矫正就可以了。
fc3使用的是dxt5n作为normal map的存放方案,rb通道是空出来的,fc3决定把gloss放入r通道,但是这个又对g通道的压缩造成影响。
这里对压缩率损失的方法,说的不是特别清楚,从文中推测是:
在r通道里面高mipmap里不是存的矫正过得gloss,而是一个toksvig的平均值,然后使用mip0的gloss和这个toksvig的值做一个scale,得到最终的结果。

实践的一些总结
physicallighting是在fc3项目比较晚的时候引进,大幅度的提升了画面质量,也证明这个晚一些做也是可以的。
性能总体上来说,没什么变化,虽然计算是多了些,但是很多不必要的hack也可以移除了,两个彼此抵消。
美术这里也可以很迅速的生成贴图,达到生动饱和的场景的目的。



你可能感兴趣的:(Engine&Render)