[sig12][PBS]Farcry3的物理光照使用物理光照的游戏列表里面又多了一个有力的成员--farcry3.这里主要讲了3
[sig12][PBS]Farcry3的物理光照
![[sig12][PBS]Farcry3的物理日照](//img.reader8.net/uploadfile/jiaocheng/20140137/2749/2014012701491545843.jpg)
使用物理光照的游戏列表里面又多了一个有力的成员--farcry3.
这里主要讲了3个方面:
diffuse贴图的矫正天空盒与sky lightingshading model的选择
why physical?提到physicallighting时候,一般的官方回答:真实的光照效果在多变光照环境下,材质始终表现正确这里我想补充一点就是,如果不是physicallighting,那么什么样呢?其实我们只有两个选择,基于真实理论的,或者基于hack,跟着感觉走硬凑的。真实理论的就是physicallighting。跟着感觉走硬凑就要面临这样的问题,在一个光照环境下是对的,但是换一个环境就不对了,当然也可能美术和程序都特别牛,经过猛烈的一顿调整之后,在所有情况下都是对的了,那么这个结果就一定是physicallighting的,只不过一个是直接在众多研究者,程序员的基础上直接抵达,一个是经过大量尝试曲线救国。
diffuse贴图的矫正这里一个概念是albedo:是指在某一个角度上,反射的能量与入射的能量的比值。这里主要讨论diffuse albedo,标准的diffuse贴图就是描述材质漫反射的一个属性,是不能带有额外的光照信息(也包括shadow,ao。。。)。但是实际我们去diffuse贴图的时候,基本都是从照片中取出来,这样就不可避免的带有光照信息。比如说我们要刻画一个乳白色的墙,但是我们在夕阳下的照片是发黄的,这样就没法正确的描述呛得乳白色的特性,同样道理,直接阳光下的过白,有阴影等都影响了diffuse属性的表达。为了达到光照正确,我们需要对diffuse贴图进行一系列的矫正。这里farcry3用的方法是:
![[sig12][PBS]Farcry3的物理日照](//img.reader8.net/uploadfile/jiaocheng/20140137/2749/2014012701491545844.jpg)
贴图都是自己拍的照片拍的时候使用一个叫macbeth color checker,就是图里面的那个调色板然后使用一个photoshop script来根据调色板的颜色值与标准的颜色值的差别,进而计算出如何进行计算才能将照片中贴图去光照信息。几个实践中的问题,f1, arcry3项目组在比较后期的时候才开始做这个事情,那么已经做好的很多贴图并没有通过重新拍照获得,也没有办法,这个时候就看artist的功力了,好的artist可以根据经验,以及已经较好色的texture来把这些图片处理好。2, 美术对于diffuse albedo难以很好的理解,对于其中的光照信息也不能很好的理解,这里做一个区分,光照信息部分是要调节掉的,但是shadow和ao是可以保留的,尽管最好是能够去掉,但是这部分工作就比较难了,fc3的工具也只是去光照信息。fc3的矫正工具还有很多可以提高的地方,比如:处理camera带来的扭曲问题使用起来也不那么便捷
sky dome与sky lighting项目初期时候,sky是使用两个贴图来描述的,这里带来两个问题:只能表现出LDR的信息没法准确描述出天空亮度上的变化(这个变化是基于物理正确的)后来fc3使用的天空模型是CIE sky model,
![[sig12][PBS]Farcry3的物理日照](//img.reader8.net/uploadfile/jiaocheng/20140137/2749/2014012701491545845.jpg)
这个模型由一些描述信息(比如描述天空是干净晴朗的,还是比较阴沉的,参数就是上面公示里面的a,b,c,d,e),然后加上角度等,就可以给出非常物理正确,很自然的结果,而且:artist也有相当的控制力自然的,而且是HDR的不会有贴图控制的带来的分辨率的问题SkyLighting
![[sig12][PBS]Farcry3的物理日照](//img.reader8.net/uploadfile/jiaocheng/20140137/2749/2014012701491545846.jpg)
skylighting在现在需要的是更加逼真,也就是有层次,像半晚这样的情况,已经不能用简单的一个颜色来代表。fc3使用的方法是根据cie sky model来把radiance信息放到一个light probe存成sh系数(2阶),然后放到shader里去使用。然后可以让artist降低饱和度来是的天光不要那么蓝:
![[sig12][PBS]Farcry3的物理日照](//img.reader8.net/uploadfile/jiaocheng/20140137/2749/2014012701491545847.jpg)
但是中间发生一个问题,就是直接使用cie sky model的时候发现给出的感觉没有照片来的“清澈”,后来发现用作参考的照片普遍使用了polarization filter,效果对比:
![[sig12][PBS]Farcry3的物理日照](//img.reader8.net/uploadfile/jiaocheng/20140137/2749/2014012701491545848.jpg)
(右边是有polarization filter)这个feature挺酷的,查了一下很有意思,这里多说一下,这里比较全偏振性是指波的震动方向和传播方向不一致,也就是只有横波才有偏振性。自然光在经过非金属的反射和折射之后,偏振方向会发生变化,变化和入射的角度有关。在摄影的时候如果使用偏振镜,就可以滤掉很多设定角度以外的偏振光,那么很多我们不需要的光线就被干掉了,会呈现出更加通透的感觉。实际的摄影效果果然很棒:
![[sig12][PBS]Farcry3的物理日照](//img.reader8.net/uploadfile/jiaocheng/20140137/2749/2014012701491545849.jpg)
在清晰的了解了这个之后,就在cie sky model基础上加了一个fake的polarize filter--一个artist指定的颜色,这样sky就呈现了偏振镜的效果了。
ShadingModelfc3早期的光照模型既不能量守恒,也没有fresnel,暴露specular power和intensity给artist,也很不直观。转向physicallighting之后,在shading model的选择上,fc3并没有和其他的有什么不同,也是microfacet brdf:
![[sig12][PBS]Farcry3的物理日照](//img.reader8.net/uploadfile/jiaocheng/20140137/2749/2014012701491545850.jpg)
但是在性能的优化和追求上,更进一步:specular power的计算上,选取了cod7里面一样的gloss是[0,1], specular power = pow(2,13*g);normal distribution function:
![[sig12][PBS]Farcry3的物理日照](//img.reader8.net/uploadfile/jiaocheng/20140137/2749/2014012701491545851.jpg)
fresnel项,一般推荐的是schlick(读成“司库力克”)approximation,这里后面有个文章使用spherical gaussion approximation进行了个优化,两者公式:
![[sig12][PBS]Farcry3的物理日照](//img.reader8.net/uploadfile/jiaocheng/20140137/2749/2014012701491545852.jpg)
visibility使用schlick smith
![[sig12][PBS]Farcry3的物理日照](//img.reader8.net/uploadfile/jiaocheng/20140137/2749/2014012701491545853.jpg)
对于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:
![[sig12][PBS]Farcry3的物理日照](//img.reader8.net/uploadfile/jiaocheng/20140137/2749/2014012701491545854.jpg)
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也可以移除了,两个彼此抵消。美术这里也可以很迅速的生成贴图,达到生动饱和的场景的目的。