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


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



这个真正亮,farcry3是一个超大场景,有日夜变换的游戏。
csm只延伸到40米,之后是使用另外一个shadow技术,可以覆盖到2kmx2km的范围。



做法是在每一个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

  • cascaded shadow map
  • 低精度的(1/4)的shadow buffer,然后使用bilateral upsampling
  • temporal caching提升shadow和ao的品质
    • 用于查询的是key,查询的结果是value
    • 这里的key是pixel的depth
    • shadow和ao的结果是value
一些未来的方向:
  • 体积阴影(volumetrics)
  • 透明物体的阴影(这个不是比较普遍了么?)
  • voxelize


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在matlab,sig文件是光谱测量数据的一种文件格式。通常,我们可以通过一些处理代码来处理sig文件并将其转换为其他形式的数据。有两个方法可以处理sig文件。 第一个方法是将sig文件的数据部分提取出来并保存为Excel文件。首先,需要使用一段代码将sig文件的头部代码去除,然后将数据部分保存为Excel文件。具体的代码可以参考引用的示例代码。 第二个方法是将生成的多个Excel文件合并成一个Excel文件,其每个文件作为一个sheet,每个sheet的名称可以根据需要设置为测试序号。首先,需要将所有的Excel文件读取进来,然后使用一段代码将它们合并成一个文件,并设置sheet的名称。具体的代码可以参考引用的示例代码。 这两种方法可以根据实际需求选择使用。如果需要进一步处理光谱测量数据,可以先将sig文件转换为Excel文件,然后再使用matlab的相关函数进行处理。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [SVC光谱数据(sig格式)matlab初步处理](https://blog.csdn.net/weixin_52726311/article/details/128749276)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值