US3S6L1——阴影的基本原理

现实中阴影的产生规则

如图所示,现实中的阴影产生规则是,在不考虑光线反射的前提下
当一个光源发射的一条光线遇到一个不透明物体 A 时,这条光线就不能够再继续照亮其他物体了(物体B的一部分)
相当于光线被更靠近光源的A物体挡住了一些,这时物体A就会向旁边的物体B投射阴影
也就是说,阴影区域的产生就是因为光线无法到达

image

Shadow Mapping 技术

基于 阴影区域的产生就是因为光线无法到达 的这个规则
前辈 Lance Williams(兰斯·威廉姆斯)在 1978 年时最早提出了 Shadow Mapping (阴影贴图)技术。
这是计算机图形学中第一个提出的通用阴影算法。

Shadow Mapping 的基本原理:将摄像机的位置放在和光源重合的位置上,那么场景中关于这个光源的阴影区域就是摄像机看不到的位置

image

注意:一般情况下,点光源用透视投影,平行光用正交投影

Shadow Mapping (阴影贴图)技术在Unity中的本质其实就是 生成一张深度图(阴影映射纹理),一般存于显存中
这张深度图记录了从该光源位置出发,能看到的场景中距离它最近表面的位置(一般记录其深度信息,值转换为0~1之间,0最近,1最远)

imageimage

Shadow Mapping 阴影贴图技术就是将摄像机的位置放在和光源重合的位置上,场景中关于这个光源的阴影区域就是摄像机看不到的位置。
它会生成一张深度图(阴影隐射纹理),一般存于显存中。
记录了从该光源位置出发,能看到的场景中距离它最近表面的深度信息(0~1之间,0最近,1最远)

Unity 如何应用 Shadow Mapping 技术

阴影映射纹理的生成是由光源完成的。

在每帧渲染的早期阶段,Unity会对每个能够投射阴影的光源创建一个对应的摄像机视角,这个视角用于捕获从光源位置看到的场景。
平行光设置为正交摄像机,点光源可能会设置多个视角,捕获多个方向的立方体阴影贴图。
Unity会渲染场景的深度信息,这些深度信息表示从光源到场景中每个物体的距离,不考虑颜色信息,最终存储在显存中。
实时阴影映射纹理需要每帧更新,但对于静态光源和静态场景,可以使用预烘焙的阴影贴图,减少实时计算的开销。

有了 阴影映射纹理 后,我们只需要在 Pass​ 中将顶点位置变换到光源空间下,得到顶点在光源空间下的三维位置信息。
然后使用 X 和 Y 分量对阴影映射纹理进行采样,得到阴影纹理中该位置的深度信息。
如果阴影纹理中取出的深度值小于该顶点的深度值,那么说明该顶点位于阴影中。(深度图中值为0~1之间,0最近,1最远)