[sig12]几个AAA游戏中的阴影技术

[sig12]几个AAA游戏中的阴影技术_第1张图片

http://www.dimension3.sk/downloads/valient12_shadows_in_games.pdf

killzone的开发公司Guerrilla的tech lead, michal valient带来,这个文章可以说是我看过的shadow的文章最特别的一篇,其中众星云集,包括:

  • god of war 3(奎爷一出谁与争锋,封面图片当然是奎爷的了)
  • far cry 3
  • killzone 3
  • infamous
  • two world
killzone3是一个30fps的游戏,作者表示做60fps游戏的人都是”骑着迅猛龙长大的,和北极熊干架的大神“,这个深有同感,当为了零点几毫秒的优化而费劲脑筋的时候,有人以翻一倍的性能在跑,这tmd也太恐怖了。
33ms是ps3上的一个数据,其中
  • 13ms:geometry
  • 10ms : post process
  • 10ms : lighting&shadow
shadow发展到现在,在这一代,技术上已经比较稳定了,常规做法大家基本有了共识:
  • cascaded shadow map
  • percentage close filter
  • variance shadow maps
这个文章并不是一个革命性的带来什么新奇算法的,而是更加实用的,集中了几个AAA游戏的做法。

little big planet
这波哥们最暴力了,他们把场景都voxel话,然后计算irradiance volume, 用ray casting计算shadow和ao。
当然little big planet场景简单太多了。

killzone3


基本部分:
  • 4 cascaded shadow map
  • pcf
  • stabilization(或者说是pixel snapping)防止抖动
  • 1408x1408 d16 shadow map,1张
  • 10+带阴影的点光源
  • 5k+ object
  • shadow map渲染时间是4-5ms
  • 点光源比较远的时候使用低精度的shadow map
  • 小物体skip
  • depth bound
特别部分:
kz3有offline cook的lightmap(只有shadow的信息),这样的话realtime shadow map可以在80米的地方就截止,而且lightmap可以产生stencil mask,进而skip掉不少像素。

infamous


基本:
  • 3 cascade
  • cascade之间有blend来避免生硬的过渡
  • 放置了不少大型的occluder来cull掉挡住的物体,然后也可以避免light bleeding
特别:
  • 会调整shadow map的方向,让建筑竖直的边和shadow map的u coordinate一致
  • 最后一个cascade用于particle的shadow
  • cut scene时候用专门的shadow map---专门绕着主角来

GodOfWar(psp&god of war collection ps3)
。。。原来psp的god of war与god of war collection ps3不是一个团队开发的。
这个版本的有一个引擎叫做ReadyAtDawnEngine。
  • light indexed deferred
  • evsm
  • sample distribution shadow maps
  • overdraw counting
    • 这个很有nice,在构建shadowmap的时候使用stencil来查每个像素的overdraw,如果没有发生overdraw,也就意味着这个像素点上是只有shadow caster,没有receiver,那么这点上可以不画caster
    • 但是这个信息怎么拿来来skip掉一些object,没说。。。

farcry3
[sig12]几个AAA游戏中的阴影技术_第2张图片


这个真正亮,farcry3是一个超大场景,有日夜变换的游戏。
csm只延伸到40米,之后是使用另外一个shadow技术,可以覆盖到2kmx2km的范围。
[sig12]几个AAA游戏中的阴影技术_第3张图片


做法是在每一个tile(64mx64m)上构建了一个heightmap(低端机器32x32,高端pc48x48),每一个像素投射到具体的这个tile的heightmap中,高于这里的高度值的就是没shadow,反之就是有shadow。
构建的过程是逐tile的,而且分帧计算:
  1. 构建light view depth,256x256
  2. 然后在tile上的格子向上采样(采样的过程就类似计算shadow了),分别隔5m,10m,40m这样,选取最高的高度,存下来,resolution是192x192
  3. downsample 192的texture到32x32.
这种做法有这么几个优势:
  • 文中没有提到,但是我觉得最棒的地方就是每个tile可以很好的分帧,我在项目里也写了个类似的,realtime的cook了一些shadow信息,然后多帧重用,但是分帧就不太好做,farcry3就可以很好的3帧一个tile的逐渐更新
  • quality上比普通的shadow map要来的好,filter和插值都非常的好

GodOfWar3
这里的shadow都是基于tile来做的,cascade是8x8x4的cell,在构建shadow的时候是8x8的2d的。
细节说的太不清楚了,还是看gdc10的原版paper吧。

two worlds 2
[sig12]几个AAA游戏中的阴影技术_第4张图片
  • cascaded shadow map
  • 低精度的(1/4)的shadow buffer,然后使用bilateral upsampling
  • temporal caching提升shadow和ao的品质
    • 用于查询的是key,查询的结果是value
    • 这里的key是pixel的depth
    • shadow和ao的结果是value
一些未来的方向:
  • 体积阴影(volumetrics)
  • 透明物体的阴影(这个不是比较普遍了么?)
  • voxelize


你可能感兴趣的:([sig12]几个AAA游戏中的阴影技术)