游戏阴影渲染知识总结
- By losuffi
- 周日 02 七月 2023
总结一下目前了解到的游戏渲染中,对于阴影的处理方式。笔者目前是使用的是UE引擎的一名码农,所以图谱也以,目前UE里看见的阴影技术为基础往外拓展。尽量做到将笔者所见到听到的阴影技术都囊括其中。
阴影与光照,一直是贯穿游戏渲染的核心主题,两者相辅相成,在3D游戏中,两者是构成精美画面最重要的一环。当然也是对于图形程序员来说,一个特别困难的任务。对于阴影而言,其困难之处主要包括:软阴影、阴影数据存储、投影方式等。
1. Shadow Map
对于当前的商业游戏引擎来说,Shadow Map,在阴影渲染技术中,属于一个最基础的方案,无论Unity 还是UE,默认的阴影方案,都是基于Shadow Map的。其核心思路是:在片元着色之前预先在光源空间中,生成一张阴影深度贴图,在片元着色阶段生成最终颜色时,读取阴影深度贴图,来得到片元是否在阴影之中的信息,进而表现出阴影着色的效果。
综上,可以优先确认其方案在实时渲染中的一些困难之处:
1. 分辨率问题,生成的Shadow Depth Map,其分辨率不可能无限大,在有限的分辨率下,如何保存一帧中,当前画面所有片元的阴影深度信息,使得其阴影信息足够精确(想象较远处,一棵树的树叶的阴影)
2. 锯齿问题,由1,很自然能想到,即使在可见区域较小,依然会存在阴影边缘处的锯齿问题
1.1 Cascade Shadow Map
对于第1个问题,通用的解决方案是Cascade Shadow Map。Cascade 并没有从源头解决分辨率不能无限的问题,只是一种将Shadow Map把分辨率分级的方式,类似LOD。从人的观察方式来说,近处一般需要更多细节,而远处本身看不清楚,需要的细节更少,以UE为例,将Shadow Map 分成4级,每一级的分辨率降低4(2x2)倍,根据距离不同,读取不同级别分辨率的Shadow Map。
1.2 PCF
对于第二个问题,在采样Shadow Depth 时,使用PCF的方案是一种常见的方式,PCF全称为:Percentage Close Filter,是一种过滤方式,在采样Shadow Depth时,同时取相邻像素的多个Shadow Depth,并分别于片元深度进行比较,然后加权累加,与之前非0即1的答案相比,在Shadow 边缘处,可以得到一个(0-1)之间的浮点值,平滑边缘。