阴影技术总结

2018-11月份写的阴影技术总结

背景

阴影在游戏的表现上的重要性无需多言,本文主要介绍及实现一些常用的阴影绘制技巧。

原理

平面阴影

平面阴影(Planar Shadow)原理为将模型上所有顶点投射到投影面上(如地面),由于只需计算将模型顶点投影到投影面上的投影矩阵,无需另外的rt消耗,所以很多手游使用此方法来绘制阴影,如王者的角色阴影:


阴影贴图投射

平面阴影虽然实现简单,但有一个表现上的问题,就是无法在曲面上显示阴影,如王者的人物在凸起的石头上没有阴影。


一种修复这种缺陷的最简单的办法就是将人物的阴影渲染出一张贴图,然后将这张贴图“投射”到物体中,原理如下图:


第1个pass是先在光源空间(light space)渲染出一张阴影贴图,第2个pass是在主视角空间渲染时,将要渲染的像素世界坐标转成光源空间下的裁剪坐标,然后通过该坐标的xy读取阴影贴图,所得的值即阴影颜色,将阴影颜色与原来的接收阴影的物体(Receiver)颜色叠加即可。

在游戏中也有很多应用,比如某手游的云阴影的渲染就是将用这种方法将贴图“投射”到地面上和其他物体上。


Shadow Map

Shadow Map是在光源空间下利用深度缓冲得出一张深度贴图,如下图(左),在渲染某个像素时,先获取该像素在光源空间下的深度值,这个像素的深度值如果比对应在深度图的深度值大,就说明该像素在阴影内,如下图(右)。


受限于贴图的精度,有时候多个片元可能从深度贴图的同一个值中去采样,这个时候需要增加阴影偏移(shadow bias)来处理

bias=0

bias=0.001

具体ps()的shader伪代码如下:


PCF

PCF(Percentage-Closer Filtering)是一种基于Shadow Map的阴影绘制方法,它是为了解决Shadow Map绘制阴影时在边缘有软化的效果,同时也起到一种抗锯齿的效果。

PCF的原理也比较简单,就是不直接读深度图的深度值,而是将统计该像素周围的NN的深度值并取其均值作为最终的深度值。如下图为77的情况。

PCF相对于普通Shadow Map,主要开销在于采样(Sample)的次数。在《Gpu Gems 1-Chapter 11. Shadow Map Antialiasing》介绍了一种用在16个像素中挑4个像素采样这种部分采样的方式,来替代4*4的方式。仿照书中的代码实现的效果如下:

a)Shadow Map

b)PCF 2*2 Sample

c)PCF 4 Sample

d)PCF 4*4 Sample

可以看到,虽然采样数一样,但PCF 4 Sample效果也未必优于PCF 22Sample,而44方式也相较于其他阴影效果更加柔和,所以要用多少个采样数要具体情况具体分析。

VSM

由于PCF的采样开销是一个费时又费力的过程,而通过VSM(Variance Shadow Maps)可以大大减少采样次数所带来的消耗。

VSM背后有一个概率学原理:切比雪夫不等式

有公式,所以直接截图了

PSSM

PSSM(Parallel-Split Shadow Maps)是在Shadow Map的基础上,将摄像机视锥体切分开n子视锥体,这样就得到n个深度图,并且通过用物体包围盒的方式将计算出一个CropMatrix,然后通过lightViewMatrix * lightProjMatrix * cropMatrix的方式将渲染像素转到光源空间,这个目的是为了增加精度,在计算阴影的时候通过这n个深度图分别计算阴影。如图是n=3的情况。

增加多个深度图的好处增大了采样的精度,由于多个深度图是相互独立,所以可以配合GPU进行并行采样。

原因如下图所示,对于ds*ds的像素,即阴影图的最小分辨率,所对应的视平面区域dp包含多个像素点,那么这些像素点就都会取相同的值,这样就产生了锯齿状的阴影边界,对于走样的度量可以定义为dp/ds:

而PSSM的子视锥体要怎么分割,《GPU Gems 3》推荐的做法是用均分+对数的方式来分割,具体原因为一系列数学推导,大致思路就是使[图片上传失败...(image-e4244f-1572685793501)] 尽可能的小。

在Unity中的Cascade Shadow就是通过PSSM来实现,默认视锥体分割大小为4。

PCSS

上述介绍的PCF和VSM虽然能使阴影边缘有模糊的效果,但因为它们都是通过类似滤波的方式来处理阴影边缘,都不是真正意义上的软阴影。真正的软阴影应考虑光源区域和以及如何渲染半影(Penumbra)。

PCSS(Percentage-Closer Soft Shadows)是一种基于Shadow Map以及光源区域的思想来实现绘制软阴影的算法。绘制过程共需要2个pass,在第1个pass得到Shadow Map,第2个pass获得一个区域大小并通过PCF获得阴影值,后者主要步骤分为三步:


1

2

3

4

下图为通过PCSS实现的阴影效果,在边缘处理上比PCF、VSM的方式更加柔和。


技术缺陷

关于技术缺陷,其实在上面的介绍有提及一些,

下面主要罗列一些其他没提及的问题:

1.VSM的光渗现象(light bleeding)

此现象主要源于式(2.2)中[图片上传失败...(image-308da0-1572685793501)] 永远非负,导致式右端永远不可能为0,表现上就是在一些被完全遮挡的物体中有可能会有光渗出的情况。


2.近平面锯齿问题

大部分基于光源空间的阴影绘制在近平面都可能有阴影锯齿严重的情况,原因是dp/ds与z成反比,[图片上传失败...(image-293aca-1572685793501)] 越小,就代表锯齿越严重。

3.PCSS的Zavg不准确问题

image.png

性能

手游对于阴影的表现优先级一般不是很高,大部分只要做到有就行,比如最简单的点阴影。而实时阴影,大部分都是通过平面阴影和曲面阴影投射的方式得出,而对于一些手游上的建筑,很多都是静态阴影+AO的方式绘制。

虽然深度检测在移动端也是个很费时的过程,但一些RPG游戏中为在曲面上有好的阴影效果也会结合深度图做一些阴影的绘制,如楚留香在人物阴影的绘制有用到Shadow Map及一些软阴影的绘制。


而对于上述介绍的算法,除了平面阴影,其他都需要额外的一张贴图。而PCF的采样由于消耗比较大,《Real Time Shadow》介绍了一种用对数在(0,1)区间内模拟生成过度自然的阴影值的方法,即用Log2(shade)来代替shade 。

而对于PSSM,由于视锥体的分割,会生成n张贴图,rt的来回切换和SetTex在移动端吃不消,一种省内存的做法是将n张贴图合在一张中。

在很久之前崩坏3中关于角色渲染的分享,也提及到上述讲述的PSSM,VSM,PCSS:)


参考

1.《GPU Gem》

2.《Real-Time Shadow》

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容