灯光和阴影

简介

Light sources emit light that mixes with the materials and produces a visible result. Light can come from several types of sources in a scene:

  • 从材质本身以发光颜色的形式(虽然它不会影响附近的物体,除非烘焙)。
  • 光节点:Directional,Omni和Spot。
  • 环境光 Environment
  • 烤光(读 烘焙光照贴图)。

发光颜色是材质特性。 您可以在 空间材质 教程中阅读更多相关内容。

轻节点

There are three types of light nodes: Directional light, Omni light and Spot light. Let’s take a look at the common parameters for lights:

../../_images/light_params.png

每个人都有一个特定的功能:

  • 颜色:发光的基色。
  • 能量:能量倍增器。 这对于使灯光饱和或使用以下内容非常有用 游戏引擎中的光传输
  • 间接能量:与间接光(光反弹)一起使用的次级倍增器。 这适用于烘焙灯或GIProbe。
  • :光变为减色而不是添加。 手动补偿一些黑暗角落有时很有用。
  • 高光:影响受此光影响的物体中镜面斑点的强度。 在零时,该光变为纯漫射光。
  • 烘烤模式:设置灯光的烘烤模式。有关更多信息,请参见:ref:doc_baked_lightmaps
  • 剔掩码:下面所选图层中的物体会受到此灯光的影响。

阴影贴图

灯光可以选择投射阴影。 这使它们具有更大的真实感(光线不会到达遮挡区域),但它会带来更大的性能成本。 有一个通用阴影参数列表,每个参数也有一个特定的功能:

  • 启用:检查以启用阴影贴图。
  • 颜色:遮挡的区域乘以此颜色。 默认为黑色,但可以更改为浅色阴影。
  • 偏置:当此参数太小时,会发生自阴影。 当太大时,阴影与脚轮分开。 调整最适合您的方法。
  • Contact: Performs a short screen-space raycast to reduce the gap generated by the bias. Contact shadows are only available when using the GLES3 backend.
  • 反向剔除面部:当使用面部剔除反转渲染阴影贴图时,某些场景效果更好。

Below is an image of what tweaking bias looks like. Default values work for most cases, but in general it depends on the size and complexity of geometry.

../../_images/shadow_bias.png

最后,如果无法解决差距,** Contact **选项可以帮助:

../../_images/shadow_contact.png

任何类型的偏差问题都可以通过增加阴影贴图分辨率来解决,尽管这可能会导致低端硬件性能下降。

定向光

这是最常见的光线类型,代表了很远的光源(如太阳)。 它也是计算中最便宜的灯,应该尽可能使用(虽然它不是最便宜的阴影图来计算,但稍后会更多)。

定向光模拟覆盖整个场景的无限数量的平行光线。 定向光节点由指示光线方向的大箭头表示。 但是,节点的位置根本不会影响照明,可以在任何地方。

../../_images/light_directional.png

Every face whose front-side is hit by the light rays is lit, while the others stay dark. Most light types have specific parameters, but directional lights are pretty simple in nature, so they don’t.

定向阴影映射

为了计算阴影贴图,从覆盖整个场景(或直到最大距离)的正交视点渲染场景(仅深度)。 但是,这种方法存在问题,因为靠近相机的物体会接收到块状阴影。

../../_images/shadow_blocky.png

为了解决这个问题,使用了名为“Parallel Split Shadow Maps”(或PSSM)的技术。 这将视锥体分成2或4个区域。 每个区域都有自己的阴影贴图。 这允许靠近观察者的小区域具有与巨大的遥远区域相同的阴影分辨率。

../../_images/pssm_explained.png

有了它,阴影变得更加详细:

../../_images/shadow_pssm.png

为了控制PSSM,暴露了许多参数:

../../_images/directional_shadow_params.png

每个分割距离相对于相机远处控制(或阴影 最大距离 ,如果大于零),因此* 0.0 是眼睛位置, 1.0 *是阴影在一定距离处结束的位置。 分裂介于两者之间。 默认值通常效果很好,但调整第一个分割是很常见的,可以为关闭对象提供更多细节(比如第三人称游戏中的角色)。

始终确保根据场景需要设置阴影 最大距离 。 距离越近,阴影的质量越高。

Sometimes, the transition between a split and the next can look bad. To fix this, the “Blend Splits” option can be turned on, which sacrifices detail in exchange for smoother transitions:

../../_images/blend_splits.png

当``物体垂直于光线``时,**``Normal Bias``**参数可用于修复自阴影的特殊情况。 唯一的缺点是它使阴影更薄。

../../_images/normal_bias.png

**``偏差分割比例``**参数可以控制远处分裂的额外偏差。 如果仅在远处的分割上发生自阴影,则此值可以修复它们。

最后, “深度范围” 有两个设置:

  • 稳定:在相机移动时保持阴影稳定,并且当靠近阴影边缘时出现在轮廓中的块保持原位。 这是默认设置,通常需要,但会降低有效的阴影分辨率。
  • 优化:尝试在任何给定时间达到最大可用分辨率。 这可能会导致阴影边缘出现“移动锯”效果,但同时阴影看起来更加细致(因此这种效果可能非常微妙,可以被原谅)。

尝试哪种设置更适合您的场景。

可以在项目设置 ->渲染 ->质量中更改方向灯的阴影贴图大小:

../../_images/project_setting_shadow.png

增加它可以解决偏差问题,但会降低性能。 阴影贴图(Shadow mapping)是一门调整的艺术。

全方位的光

全光是一种点光源,可在所有方向上发射光,直至给定半径。

../../_images/light_omni.png

在现实生活中,光衰减是反函数,这意味着全向光没有半径。 这是一个问题,因为这意味着计算几个全向灯会变得很困难。

为了解决这个问题,引入了* Range *和衰减功能。

../../_images/light_omni_params.png

这两个参数允许在视觉上调整其工作方式,以便找到美学上令人愉悦的结果。

../../_images/light_attenuation.png

全方位阴影贴图

全方位光影映射相对简单。 需要考虑的主要问题是用于渲染它的算法。

Omni Shadows can be rendered as either “Dual Paraboloid” or “Cube Mapped”. The former renders quickly, but can cause deformations, while the later is more correct, but costlier.

../../_images/shadow_omni_dp_cm.png

如果渲染的对象大部分是不规则的,那么双抛物面通常就足够了。 在任何情况下,由于这些阴影被缓存在阴影图集中(更多的是在结尾处),因此对于大多数场景而言,它可能不会对性能产生影响。

聚光灯

聚光灯类似于全向灯,除了它们只发光到锥形(或``截止``)。 它们可用于模拟手电筒,汽车灯,反射器,光点等。这种类型的光也会向其指向的相反方向衰减。

../../_images/light_spot.png

聚光灯共用 范围衰减 为** OmniLight **,并添加两个额外参数:

  • 角度:光线的光圈角度
  • 角度衰减:锥形衰减,有助于软化锥形边界。

现场阴影贴图

斑点不需要任何阴影映射参数。 请记住,在超过89度的光圈下,阴影会停止对斑点起作用,您应该考虑使用Omni灯。

影子地图集

Unlike Directional lights, which have their own shadow texture, Omni and Spot lights are assigned to slots of a shadow atlas. This atlas can be configured in Project Settings -> Rendering -> Quality -> Shadow Atlas.

../../_images/shadow_atlas.png

The resolution applies to the whole Shadow Atlas. This atlas is divided into four quadrants:

../../_images/shadow_quadrants.png

Each quadrant can be subdivided to allocate any number of shadow maps; the following is the default subdivision:

../../_images/shadow_quadrants2.png

分配逻辑很简单。 最大的阴影贴图大小(当不使用细分时)表示屏幕大小(或更大)的亮度。 细分(较小的地图)表示远离视图并且比例较小的光的阴影。

Every frame, the following procedure is performed for all lights:

  1. 检查灯是否在正确大小的插槽上。 如果没有,重新渲染它并将其移动到更大/更小的插槽。
  2. 检查影响阴影贴图的任何对象是否已更改。 如果是的话,重新渲染光线。
  3. 如果上述情况均未发生,则不执行任何操作,阴影保持不变。

If the slots in a quadrant are full, lights are pushed back to smaller slots, depending on size and distance.

This allocation strategy works for most games, but you may want to use a separate one in some cases (for example, a top-down game where all lights are around the same size and quadrants may all have the same subdivision).

阴影滤镜质量

可以调整阴影的滤镜质量。 这可以在项目设置 ->渲染 ->质量 ->阴影中找到。 Godot不支持过滤器,PCF5和PCF13。

../../_images/shadow_pcf1.png

它会影响阴影轮廓的块状:

../../_images/shadow_pcf2.png