- 【Unity3D技术文档翻译】第3.5.2篇 线性光阴影
- 【Unity3D技术文档翻译】第3.6篇 全局光照概述(Glob
- 【Unity3D技术文档翻译】第3.5.1篇 阴影详情
- 【Unity3D技术文档翻译】第3.6.7篇 反射探针概述(R
- 【Unity3D技术文档翻译】第3.6.4篇 烘焙环境遮蔽(Ba
- 【Unity3D技术文档翻译】第3.6.2.4篇 自定义光衰减(
- 【Unity3D技术文档翻译】第3.6.5篇 LOD与烘焙光照贴
- 【Unity3D技术文档翻译】第2.3.3.2篇 反照率颜色与透
- 【Unity3D技术文档翻译】第3.6.7.1篇 反射探针类型
- 【Unity3D技术文档翻译】第2.3.3.12篇 材质查阅图表

本章原文所在章节:【Unity Manual】→【Graphics】→【Graphics Overview】→【Lighting】→【Light sources】→【Shadows】→【Shadows】
阴影详情
开启阴影
使用 Light 组件中的 Shaow Type 属性来开启阴影并选择类型。

属性 | 作用 |
---|---|
阴影类型 | Hard Shadows 类型产生锋利边缘的阴影。Hard Shadows 的表现没有 Soft Shadows 真实,但是涉及到更少的处理,在许多情况下是可接受的。Soft Shadows 能够减少阴影贴图上的块状锯齿。 |
Strength(强度) | 该选项决定了阴影有多黑。一般来说,灯光会被大气散射,以及被其他游戏对象反射,因此你通常不会想将阴影设置为最大强度。 |
Resolution(分辨率) | 该选项设置阴影贴图的分辨率。如果你想让阴影清晰可见,就可以增加该值。 |
Bias(偏移) | 使用该选项来调整阴影的位置和清晰度。下面将讲解详情。 |
Normal Bias(法线偏移) | 使用该选项来调整阴影的位置和清晰度。下面将讲解详情。 |
Shadow Near Plane(阴影近平面) | 该选项让你在渲染阴影时选择近平面的值。如果游戏对象与摄像机的距离比该值还小,将不产生阴影。 |
场景中的每个 Mesh Renderer 都具有 Cast Shadows 和 Receive Shadows 属性,需要视情况开启。

通过 Cast Shadows 下拉菜单的 on 和 off 选项来选择是否开启网格的阴影。另外,还可选择 Two Sided 选项来让阴影能够在表面的两面都产生阴影(因此为了生成阴影,背面剔除将被忽略);以及选择 Shadows Only 选项只产生阴影,而游戏对象不可见。
阴影贴图与 Bias 属性
给定光线的阴影在最终的场景渲染中被确定。当场景被渲染到主摄像机视图时,视图中的每个像素位置都被转换为光的坐标系统。像素到灯光的距离,将与其对应的阴影贴图中的像素进行对比。如果像素比它在阴影贴图中对应的像素距离更远,那么就可假定该像素被另一个游戏对象遮挡,于是没有获得照明。

被光线直接照射的表面有时会出现部分阴影。这是因为应该与阴影贴图中指定的距离相同的像素有时被计算为离得更远(这是使用阴影过滤的结果,或者是因为用作阴影贴图的图片分辨率较低)。当它们都应该被照亮时,结果却出现了任意图案的像素阴影,这样的视觉效果被称为 “shadow acne(阴影痤疮?)”。

为了防止 shadow acne,一个 Bias 值可被添加到阴影贴图的距离上,以确保边界上的像素能够正确的通过比对;或者确保当游戏对象被渲染进阴影贴图时,能沿着法线做一点偏移。当阴影被开启后,这些值可通过 Light 组件检查器中的 Bias 和 Normal Bias 属性进行设置。
不要将 Bias 值设置得太高,否则游戏对象附近的阴影区域有时会错误的被照明。结果就是分离的阴影,让游戏对象看起来就像漂浮在地面上。

同样的,Normal Bias 值设置得太高,将导致游戏对象的阴影变得太狭窄。如下图所示

在某些情况下,Normal Bias 会导致一种叫作 “light bleeding(灯光渗透)”的有害效果,即本该是阴影的地方,灯光却从附近几何体渗透而过。一个潜在的解决方案是打开游戏对象的 Mesh Renderer 组件,然后将 Cast Shadows 属性设置为 Two Sided。该方法有时有效,但是资源敏感并会增加渲染的性能负担。
灯光的偏差值可能需要调整,以确保不需要的效果不会发生。使用眼睛要比数学计算能更简单地测量得出正确的值。
为了更进一步放置 shadow acne,我们正使用一种叫做 Shadow pancaking(阴影压缩)的技术(详情请看下节相关内容)。这通常很有效,但同时会产生巨大三角面的视觉效果。

调整 Shadow near plane offset 属性值能够解决该问题。但是如果设置得太高,又会产生
shadow acne。

如果本文对你有帮助的话,点个赞或者评论一下吧!
网友评论