Uncharted 4送厂压片之后
整个工作室都闲了下来,大部分的人都跑去休假了
没有休假的(包含我),现在就是随意进行R&D
一部份程式人员在研究赶工期间错过的GDC讲座
我发现有个不用付费就可以观看的讲座,觉得很有意思,贴来分享一下
http://goo.gl/8Lylup
Advanced Geometrically Correct Shadows for Modern Game Engines
"适合现代游戏引擎的进阶几何正确影子渲染法"
(by Jon Story)
以下是我个人的简易诠释
详细附图说明请看原讲座录影联结
目前最多人用的即时影子渲染法是shadow map
这个方法有几个缺点
- 影子的品质和运算效能取决于shadow map的分辨率
- 高频率的几何细节,会因为shadow map分辨率不够而产生影子缺块
- 为了解决stairing瑕疵而导入的补正权重会造成Peter Panning瑕疵
讲座提供的解决方法为Frustum Traced Shadow (FTS)
大致步骤如下
1. 渲染好screen space depth buffer (SSDB)
2. 准备一个2D light space buffer (LSB)
3. 到目前为止都还跟shadow map一样,接下来就不同了
准备一个screen space list buffer (SSLB)
每一个LSB像素代表一个linked list的开头,连结著每一个SSLB里面的像素
同一个linked list里面的SSLB像素
代表world space座标映照到同一个LSB像素
4. 接下来在LSB上面rasterize所有shadow caster的三角形
每个三角形,都是先用geometry shader计算出因光源产生的影子frustum
针对每一个被涵盖的LSB像素,iterate所有linked list串起来的SSLB像素
每一个SSLB像素对应的world space座标,测试是否有被影子frustum涵盖
如果有被涵盖,该像素就在此shadow caster三角形的影子内
这个做法最大的优点就是可以生出几何正确的影子,跟shadow map分辨率完全无关
效能瓶颈之一是linked list的长度
讲座中有提供一个dynamic reprojection解法,可以有效消除这个效能瓶颈
基本上就是把过长的linked lists对应的SSLB像素区域,再做一次投射到一个新的SSLB
原本的非零SSLB区域也重新伸展到整个buffer的范围,以有效利用内存
到目前为止做出来的是hard shadow
要做出soft shadow,Jon提出的做法是与percentage closer soft shadow (PCSS)做混合
当一个像素与shadow caster距离较近,则FTS权重较高,反之则PCSS权重较高
Jon称这个混合方为Hybrid Frustum Traced Shadow (HFTS)
HFTS的效能需求普遍比shadow map高一些,但仍然能够即时渲染
未来可望HFTS技术在更多的游戏中出现
以上 :)