[siggraph2011]使命召唤之黑色行动中的光照技术

来源:互联网 发布:人工智能无人驾驶飞机 编辑:程序博客网 时间:2024/04/27 15:21


PhysicallyBased Lighting in Call of Duty: Black Ops 

Dimitar Lazarov@Treyarch带来。

                                                                                                                                                                                           

开发原则

treyarch开发过程中遵循这样的原则:“一起以效率为核心。

很多地方有很多的

  • 限制:可以简化问题,节省开发时间
  • 特殊处理:以便把限制发挥到极致

实际开发中也的确如此,基本上treyarch比较看重实际,crytek看重上流,两者在销量和口碑上都分别达到自己梦想了。

 

                                                                                                                                                                                           

forward lighting

treyarch依旧使用forward lighting,对它们来讲想达到60fps,deferred lighting太费了,deferred lighting更适合把帧数从15帧拯救到30,而不是从50弄到60.

但是forward lighting在很多地方付出了不小的代价:

  • mesh要小心的切分
  • lighting数量和摆放要好好控制

                                                                                                                                                                                           

baked lighting

 

做了这几件事情:

  • light map
  • light grid:也就是irradiance volume这类的
  • environment probe:和crytek的那个差不多

radiance&irradiance

这里dimitar又给大家复习了下这两个概念:

  • irradiance:surface上的一个点中入射的所有光的量
  • radiance:一个点在一个方向上发出的光的量
  • 两者之间是一个积分的关系,也就是radiance*dot(N,L)做半球积分便是irradiance

                                                                                                                                                                                            

runtime lighting

  • diffuse
    •     primary diffuse:dot(N,L)
    •     secondary diffuse:从lightmap和lightgrid里面构建出来
  • specular
    •     prmary specular:microfacet brdf
    •     secondary specular :通过environment probe,fresnel,

physicallybased的原因:

  • 更加的写实
  • 更加的贴近现实并保持一致,美术也不用调整那么多
  • 也就是在制作量和品质上会更好
  • 额外的alu消耗也比较有限

其他一些相关:

  • gamma correct pipeline
  • hdr
    •     没有用16位的rendertarget
    •     把亮度限定在0--4
    •     使用art driven exposure,而不是gpu down sample出来的那种,直接在shader输出光照的使用应用
    •     还用filmic curve

                                                                                                                                                                                           

光照模型

 microfacet理论,直接看klayge的wiki吧,说的清晰简单。

 早起treyarch使用cook-torrance模型,这也是众多学院派所提倡和建议的,但是后面在研究深入了之后发现可以在quality和performance上做的更好。

因外BRDF里面的几个部分可以各自选择:

  • distribution function
  • fresnel
  • visibility function

所以treyarch就在这一块多下了很多功夫。

 

  • distribution function
    • 开始尝试的是beckmann
    • 之后是用的phong ndf,发现效率更好,与beckmann几乎一样
  • fresnel
    • schlick's approximation to fresnel(也就是取代cook torrance里的,获得更好的效率)
    • 这里需要注意的就是microfacet理论下,normal其实是h(normalize(lightDir+viewDir)),这样给定viewdir和lightdir的话,fresnel项是一个和物件表面的normal无关的一个东西,这里可能有同学(比如我)会觉得不对劲,但是用这个理论模型就是这样,物件normal带来的明暗变化在distribution function和visibility function中带来,所以这一块实际上是类似全屏变亮变暗的项,使用1反而更接近正确的结果。
  • visibility function
    • Kelemen-Szirmay-Kalos approximation to cook-torrance(4 instruction)
    • Schlick's approximation to Smith'sShadowing Function(8 instruction)
    • 这几种方式各有千秋,treyarch最终选择了Schlick-smith,效果最好(性能消耗最大)
    • visibility function是一个在normal,lightDir,viewDir,specPower上的函数,表达的是有给定normal的microfacet被light和view看见的几率

                                                                                                                                                                                          

EnvironmentMap

首先environement map怎么用的问题,b3d上问了一下,得到较为准确的答案,environement map要理解为是secondary specular,正如irradiance volume等是secondary diffuse一样的位置,作为primary specular light的补充存在的。

第一个问题就是environment map的压缩问题,大的resolution效果好,但是无法承受其消耗。

解决的办法是把environment map中的亮度在地图中除以averagediffuse lighting,然后进行存储,在使用的时候再通过乘以averagediffuse lighting转回来。

解除亮度之后呢,evironment map其实就变成environmentdistribution map了。

这个过程treyarch叫做normalization,但是这个之后怎么去节省内存,没说。。。估计是normalized color可以少一个通道等方法压缩。

 

这里还提到了一个工具是ati的CubeMapGen,可以生成CubeMap,prefiltermipmap, dxt自己的工具还有些问题,cubemapgen可以把这些处理好。

 

sample cube map的时候和crytek一样,根据gloss的值来选择不同mipmap的texel来sample,对于很glossy的material,就会出现很大的mipmap 上sample的跳跃,也就是会造成texture cache trashing。

treyarch的解决办法是:variance to gloss---没有细说,应该是对gloss的方差严重的材质做一些blur。

 

fresnelfor glossy reflections

 

fresnel这里有这样几个选择:

  • mirror reflection
  • microfacet highlights
  • glossy reflection---把多个microfacet normal平均一下

一个效果上完美的solution是做多个cubemap sample,把它们用brdf做到一起,但是这个就太消耗了。

所以在要达到的目的清晰的前提下,treyarch采取的方法是把从prefilter的cubemap里读出的值来替代使用cube map多点sample,然后brdf,在积分的方法。

 

                                                                                                                                                                                          

special cases

 materialspecular color基本可以分成两个部分:

  • metal,colored specular大于0.5f(linear space)
  • non-metal, monochrome specular between 0.02and 0.04 linear space

纯金属类的shader:没有diffusetexture,没有diffuse lighting

非金属类:没有specular texture,

                                                                                                                                                                                          

美术方面

 这部分很喜欢,程序员谈游戏开发只谈技术就太狭隘了。

这里技术上的革新给美术带来一些不适应,需要更多的培训和示例,在美术制作的时候需要一段时间来培养这种感觉,因为以前美术画一个东西出来什么样子心里能估个大概,但是刚转到新的技术上时候感觉要重新建立,所见即所得的工具非常重要。

 

diffusetexture,使用照片来做diffuse texture就不太行,因为照片里面已经包括了lighting信息,需要被仔细的校准。

specularmap,不再是specular_map_texel*pow(dot(h,l),spec_power)里面的那一项了。

这样也不再能把ao cook到spectex里了。

而且也没有gloss map重要。

glosstexture,最重要的也是最难做的map,

 

                                                                                                                                                                                          

小结

 physicallybased lighting消耗额外的%10--%20的ALU,但是效果上有较大提升,是一个高性价比的选择。

 


原创粉丝点击