# 阴影

当光源的光线由于其他物体的遮挡而不能到达一个物体的时候,这个物体就处在阴影当中。阴影可以让观察者获取物体之间的空间位置和比例关系,场景和物体的深度感和真实感得到提升。

# 阴影贴图

基于实际应用场景考虑,目前只支持主平行光的实时阴影。首先,我们先了解一下阴影贴图的工作思路:以光源的位置为视角进行渲染,无法看到的地方恰好就处在阴影当中,否则就正常被光照亮。在这次渲染中,将深度缓冲记录在一张贴图中,当对场景进行真正的光照渲染时,通过这张深度贴图能追踪到最接近光的表面。

# 级联阴影

基础的阴影贴图在大场景下存在贴图精度问题:

  1. 阴影贴图精度不足,产生锯齿
  2. 相机近处场景对应的阴影贴图像素覆盖率比较低

这会导致靠近相机的阴影锯齿比远端严重,被称为透视误差 解决透视误差的常用方法是级联阴影贴图:

  1. 将视锥体分割为多个部分,每个部分单独渲染阴影贴图
  2. 离摄像机近的部分覆盖较小的区域,远端则覆盖更广的区域
  3. 靠近相机物体比远处物体的阴影生成更高的贴图质量

# 阴影配置

在 MeshRenderer 面板,有设定是否接受阴影和投射阴影的选项: 也可以在脚本代码中设定阴影是否开启:

  const meshRenderer = entity.getComponent(engine.MeshRenderer);
  meshRenderer.castShadow = true;
  meshRenderer.receiveShadow = false;

在相机面板中,我们可以配置阴影的相关属性:

属性 功能
shadowMode 切换多级阴影
cascadedSplits 采用多级阴影时,每一级的划分比例
shadowFitMode 渲染阴影时的视锥体计算模式
shadowDistance 最大距离内的对象将投射阴影