Skip to content

简介

在 3D 场景中,光与影一直都是极其重要的组成部分,它们能够丰富整个场景。灯光可以将阴影从 游戏对象(Game Object)投射到其自身的其他部分,或附近的其他游戏对象上。质量好的阴影可以使得整个场景具有立体感。

【Shadows001.png】

SandMod 中场景阴影的显示效果。

阴影逻辑

在场景中,来自光源的光线无法到达的场景区域,光照系统将判断对应区域处于阴影之中。
光照系统使用有关光线在撞击网格或平面之前,光线传播了多远的信息以填充阴影贴图。

然后光照系统会对阴影贴图进行采样以计算光线撞击的 游戏对象(Game Object)的实时阴影。

【Shadows002.png】

SandMod 中场景阴影计算效果图。

显示阴影

如果希望 游戏对象(Game Object)的阴影可被看见,需要同时满足以下条件:

  • 游戏对象支持产生阴影。
  • 照射的光源支持产生阴影。
  • 有支持显示阴影的游戏对象。

如果阴影没有显示,请确认以下信息:

产生阴影的游戏对象所引用 材质(Material)的 着色器(Shader)需要支持光照计算。

【Shadows003.png】

如果产生阴影的游戏对象有 网格渲染器(Mesh Renderer)或 蒙皮网格渲染器(Skinned Mesh Renderer)组件 ,投射阴影(Cast Shadows)属性值为 启用(On)或 双面(Two Side)。

【Shadows004.png】

照射对应游戏对象的 光源(Light)的 阴影类型(Shadow Type)属性值为 硬阴影(Hard)或 软阴影(Soft)。

【Shadows005.png】

光源的 阴影强度(Shadow Strength)属性值不为 0。

【Shadows006.png】

能显示阴影的游戏对象需要有网格渲染器或蒙皮网格渲染器组件,且 接收阴影(Receive Shadows)属性为 勾选状态(True)。

【Shadows007.png】

去除阴影暗斑

阴影暗斑

当 点光源(Point Light)或 聚光灯(Spot Lights)类型光源的光线方向与地平线的夹角足够小,场景中就会很容易出现明暗交替且垂直于光源光线的线状阴影斑痕,这种斑痕称为阴影暗斑。

Shadows008.pngShadows009.png
正常情况下场景的阴影效果场景出现阴影暗斑的示例

产生阴影暗斑是由于阴影贴图对于光源空间的深度的采样是离散的,阴影贴图上每个 纹素(Texel,Texture Pixel)只能记录一个深度值。而计算阴影的对象,是场景中具有连续性的物体面片。这就导致本该连续的面片上出现一段连续的不同的深度,但记录在阴影贴图上是一个相同的深度值。

Shadows010.png

正常情况下的阴影采样示意图,其中:1:采样位置。2:物体 面片(Face)示意。3:偏差值(Bias),可在生成阴影的光源中设置。4:采样深度值。5:生成阴影的示例。

光源的光线方向与地平线的夹角足够小,在计算对应位置在光源空间的深度值时出现精度问题,导致光照系统误以为部分区域被遮挡了,因此产生了阴影,造成了阴影暗斑的视觉效果。

Shadows011.png

当改变光源角度后出现阴影暗斑的阴影采样示意图,其中:1:采样位置。2:物体 面片(Face)示意。3:偏差值(Bias),可在生成阴影的光源中设置。4:采样深度值。5:生成阴影的示例。

调整偏差值

如果需要解决阴影暗斑的问题,您可以选中产生阴影的光源,并在 检视窗口(Inspector)中调大对应光源的 光源(Light)组件(Component)的 偏差(Bias)属性。

【Shadows012.png】

调整偏差值的方法。

其原理就是增加 偏差值(Bias)后将对应采样位置的深度值调大,这样只有当阴影贴图中的深度值显著大于计算出来的深度值时,才会判断为产生阴影。

Shadows013.png

调大偏差值后的阴影采样示意图,其中:1:采样位置。2:物体 面片(Face)示意。3:偏差值(Bias),可在生成阴影的光源中设置。4:采样深度值。5:生成阴影的示例。

值得注意的是,如果 偏差(Bias)值调整得太大,会导致深度值与实际相差太大,会让阴影与应该产生阴影的位置脱离。

Shadows014.png

偏差值调整过大导致阴影脱离的阴影采样示意图,其中:1:采样位置。2:物体 面片(Face)示意。3:偏差值(Bias),可在生成阴影的光源中设置。4:采样深度值。5:生成阴影的示例。

对应的实际效果就会像产生阴影的物体都飘浮在空中。

Shadows015.png

阴影法线偏差值

您也可以通过修改阴影法线偏差值修正阴影暗斑的问题,特别是阴影暗斑出现在具有高曲率和平滑法线的低面多边形几何体上,效果会非常明显。

Shadows016.pngShadows017.png
具有高曲率和平滑法线的低面多边形几何体默认情况下的阴影暗斑调整 阴影法线偏差值(Normal Bias)后,高曲率和平滑法线的低面多边形几何体的显示效果

修改路径与修改 偏差值(Bias)一致,您可以选中产生阴影的光源,并在 检视窗口(Inspector)中调大对应光源的 光源(Light)组件(Component)的 阴影法线偏差(Normal Bias)属性。

【Shadows018.png】

调整阴影法线偏差值的方法。

值得注意的是,阴影法线偏差值(Normal Bias)不建议有过大的改动,不然会对整个场景的阴影质量产生严重的负面影响,尤其是对于精细细节区域而言。如上文的场景案例,用于绑箱子的绑带按正常情况是会产生阴影的,但是在调整 阴影法线偏差值(Normal Bias)后,绑带的阴影无法显示,导致场景立体感大打折扣。

Shadows019.pngShadows020.png
阴影法线偏差(Normal Bias)值为 0.5 时绑带等细节处的阴影都可以正常显示阴影法线偏差(Normal Bias)值调大时绑带等细节处的阴影逐渐消失,直至值为 2 时完全消失