Version: 6000.3
语言: 中文
影子级联的实现细节
思考

阴影故障排除

减少阴影闪烁

如果阴影远离相机在场景中创建特定视点图像的组件。输出要么绘制到屏幕上,要么作为纹理捕获。更多信息
请参阅术语表
.有关更多信息,请参阅了解视锥体

如果阴影比世界空间原点更靠近摄像机,请启用相对于摄像机的剔除。Unity 使用相机作为阴影计算的相对位置,而不是世界空间原点,从而减少闪烁。

要启用摄像机相关剔除,请执行以下步骤:

  1. 转到 项目设置(Project Settings) > 图形(Graphics) > 剔除设置(Culling Settings) > 摄像机相关剔除(Camera-Relative Culling) 。
  2. 启用阴影。

影子性能

渲染实时阴影对性能有很高的影响。任何游戏对象Unity 场景中的基本对象,可以表示角色、道具、风景、相机、航路点等。游戏对象的功能由附加到它的组件定义。更多信息
请参阅术语表
可能投射阴影的必须首先渲染到阴影贴图中,然后使用该贴图来渲染可能接收阴影的对象。

软阴影的渲染开销比硬阴影更大,但这只会影响GPU,不会导致太多额外的CPU工作。

如果为复杂几何体渲染实时阴影的成本过高,请考虑使用 lowLOD细节级别 (LOD) 技术是一种优化,可减少 Unity 在游戏对象与相机的距离增加时必须为游戏对象渲染的三角形数量。更多信息
请参阅术语表
网格甚至图元来投射阴影。

如果这太占用资源,您可以使用应用于简单meshUnity 的主要图形原语。网格体构成了 3D 世界的很大一部分。Unity 支持三角或四边形多边形网格。Nurbs、Nurms、Subdiv 曲面必须转换为多边形。更多信息
请参阅术语表
quad 类似于平面但其边只有一个单位长的图元对象,它只使用 4 个顶点,并且表面定向在局部坐标空间的 XY 平面上。更多信息
请参阅术语表
在角色下方,或者可以使用自定义着色器创建斑点阴影。

阴影痤疮

被光直接照亮的表面有时看起来部分处于阴影中。这是因为应该恰好位于阴影贴图中指定的距离的像素有时会被计算为距离较远(这是使用阴影过滤或阴影贴图的低分辨率图像的结果)。结果是像素在应该被照亮时在阴影中出现任意图案,从而产生一种称为“阴影痤疮”的视觉效果。

假自阴影伪影形式的阴影痤疮
假自阴影伪影形式的阴影痤疮

调整阴影偏差设置

通过调整阴影偏差值,可以减少或消除阴影瑕疵、阴影分离(也称为彼得平移)、漏光和自阴影等阴影伪影。

在内置渲染管线获取场景内容并将其显示在屏幕上的一系列作。Unity 允许您从预构建的渲染管线中进行选择,或编写自己的渲染管线。更多信息
请参阅术语表
,则启用阴影时,您可以使用“光源检查器”窗口中的“偏差”和“法线偏差”属性设置这些值。

不要将 Bias 值设置得太高,因为投射阴影的游戏对象附近的阴影周围的区域有时会被错误地照亮。这会导致阴影断开连接,使游戏对象看起来好像在地面上飞行。

较高的 Bias 值会使阴影看起来与游戏对象断开连接
较高的 Bias 值会使阴影看起来与游戏对象“断开连接”

同样,将 Normal Bias 值设置得太高会使阴影对于 GameObject 来说显得太窄:

高法线偏差值会使阴影形状太窄
法线偏差值会使阴影形状太窄

在某些情况下,法线偏差可能会导致称为光渗出的不良效果,即光线从附近的几何体渗入应阴影的区域。一个潜在的解决方案是打开游戏对象的网格体渲染器(Mesh Renderer一个网格体组件,用于从网格体过滤器中获取几何体,并将其渲染到对象的变换组件定义的位置。更多信息
请参阅术语表
并将 投射阴影(Cast Shadows) 属性更改为 双面(Two Sided)。这有时会有所帮助,尽管在渲染场景场景包含游戏的环境和菜单。将每个唯一的场景文件视为一个独特的关卡。在每个场景中,你放置你的环境、障碍物和装饰品,基本上是将你的游戏设计和构建成碎片。更多信息
请参阅术语表
.

光源的偏差值可能需要调整,以确保不会发生不需要的效果。通常,通过肉眼测量正确的值比尝试计算它更容易。

较低的“平面附近阴影偏移”值会在阴影中创建孔洞的外观
较低的“平面附近阴影偏移”值会在阴影中创建孔洞的外观
正确的阴影
正确的阴影

阴影盘块

为了进一步预防阴影痤疮,我们使用了一种称为阴影粉刺的技术。这个想法是减少沿光线方向渲染阴影贴图时使用的光源空间范围。这导致阴影贴图的精度提高,减少阴影痤疮。

显示影子盘块原理的图表
显示影子盘块原理的图表

在上图中:

  • 浅蓝色圆圈代表阴影投射者
  • 深蓝色矩形表示原始光空间
  • 绿线表示优化的近平面(不包括视锥体中不可见的任何阴影投射器)

将这些阴影投射器夹紧到优化空间的近裁剪平面(在顶点着色器中)。请注意,虽然这通常效果很好,但它可能会为穿过近裁剪平面的非常大的三角形创建伪影:

大三角形问题
大三角形问题

在这种情况下,蓝色三角形只有一个顶点位于近裁剪平面后面并被夹紧到该平面上。但是,这会改变三角形形状,并可能产生不正确的阴影。

你可以从 质量(Quality) 窗口中调整 平面附近阴影偏移(Shadow Near Plane Offset) 属性,以避免此问题。这将拉回近夹平面。但是,将此值设置得非常高最终会导致阴影痤疮,因为它会增加阴影贴图在光线方向上需要覆盖的范围。或者,您也可以对有问题的阴影投射三角形进行细分。

阴影未出现

如果您发现一个或多个对象没有投射阴影,那么您应该检查以下几点:

  • 可以在“质量”窗口中完全禁用实时阴影。确保您启用了正确的质量级别,并且为该设置打开了阴影。

  • 场景中的所有网格体渲染器都必须正确设置其 接收阴影(Receive Shadows) 和 投射阴影(Cast Shadows) 。默认情况下,两者都处于启用状态,但请检查它们是否未无意中禁用。

  • 只有不透明对象才能投射和接收阴影,因此使用内置的透明或粒子着色器的对象既不会投射也不会接收。通常,您可以将透明切口着色器用于具有“间隙”的对象,例如栅栏、植被等。习惯着色器GPU 上运行的程序。更多信息
    请参阅术语表
    必须是像素光照的,并使用 几何体渲染队列

  • 使用 VertexLit 着色器的对象无法接收阴影,但可以投射阴影。

  • Unity 无法计算具有具有“Unlit”类型着色器的材质的游戏对象的阴影。Unity 只能计算具有支持光照的着色器的材质的阴影。

  • 在内置渲染管线中,使用前向渲染路径,某些着色器只允许最亮的定向光投射阴影(特别是,4.x 版本的 Unity 内置着色器会发生这种情况)。如果你想要有多个阴影投射光源,那么你应该使用延迟着色(Deferred Shading) 内置渲染管线中的渲染路径,对可能影响游戏对象的光源数量没有限制。所有光源都是按像素计算的,这意味着它们都与法线贴图等正确交互。此外,所有光源都可以有饼干和阴影。更多信息
    请参阅术语表
    渲染路径渲染管道用于渲染图形的技术。选择不同的渲染路径会影响照明和着色的计算方式。某些渲染路径比其他路径更适合不同的平台和硬件。更多信息
    请参阅术语表
    相反。您可以使用fullforwardshadows 表面着色器内置渲染管线编写着色器的简化方法。更多信息
    请参阅术语表
    命令。

其他资源

影子级联的实现细节
思考