灯光和阴影

介绍

光源发出与材料混合并产生可见结果的光。光可以来自场景中的几种光源:

  • 从材质本身以发射颜色的形式(尽管它不会影响附近的对象,除非烘焙)。

  • 光节点:方向、全向和光点。

  • 环境光 Environment .

  • 烘烤光(读取 烘焙光照图

发射颜色是一种材料属性。您可以在 空间材料 辅导的。

灯光节点

有三种类型的光节点: Directional lightOmni lightSpot light . 让我们来看一下灯光的常用参数:

../../_images/light_params.png

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

  • 颜色 :发射光的基色。

  • 能量 :能量倍增器。这对于使灯饱和或使用 高动态范围 .

  • 间接能 :与间接光(光反弹)一起使用的辅助倍增器。这在烘焙光或giprobe中工作。

  • 否定的 :光变为减法而不是加法。有时手动补偿一些暗角很有用。

  • 镜面反射 :影响受此光影响的对象中镜面斑点的强度。在零点时,该光成为纯漫反射光。

  • 烘焙模式 :设置灯光的烘焙模式。有关详细信息,请参阅 烘焙光照图

  • 剔除遮罩 :下面选定层中的对象将受此灯光影响。

阴影映射

灯光可以选择性地投射阴影。这给了他们更大的现实性(光不会到达封闭区域),但它会导致更大的性能成本。有一个通用阴影参数列表,每个都有一个特定的函数:

  • 启用 :选中可在此灯光中启用阴影映射。

  • 颜色 :被遮挡的区域乘以该颜色。默认情况下它是黑色的,但可以更改为着色阴影。

  • Bias :当此参数太小时,会发生自阴影。如果太大,阴影就会与脚轮分离。调整到最适合你的。

  • 联系 :执行短屏幕空间光线投射以减少由偏移产生的间隙。只有在使用gles3后端时,接触阴影才可用。

  • 反转剔除面 :当使用反转的面剔除渲染阴影映射时,某些场景工作得更好。

下面是调整偏差的图像。默认值适用于大多数情况,但一般情况下,它取决于几何图形的大小和复杂性。

../../_images/shadow_bias.png

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

../../_images/shadow_contact.png

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

平行光

这是最常见的类型的光,代表一个非常远的光源(如太阳)。它也是最便宜的光来计算,应该尽可能使用(尽管它不是最便宜的阴影图来计算,但以后会更多)。

定向光模拟了无限多的平行光线覆盖整个场景。方向光节点由一个大箭头表示,该箭头指示光线的方向。但是,节点的位置完全不影响照明,可以是任何位置。

../../_images/light_directional.png

每一张正面被光线照射的脸都被照亮,而其他脸则保持黑暗。大多数灯光类型都有特定的参数,但是方向灯在本质上非常简单,所以它们没有。

方向阴影映射

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

../../_images/shadow_blocky.png

为了解决这个问题,使用了一种名为“平行分割阴影贴图”(或PSSM)的技术。这将视图截锥拆分为2个或4个区域。每个区域都有自己的阴影图。这样,靠近观察者的小区域的阴影分辨率可以与远离观察者的大区域的阴影分辨率相同。

../../_images/pssm_explained.png

这样,阴影会变得更加详细:

../../_images/shadow_pssm.png

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

../../_images/directional_shadow_params.png

每个分割距离都是相对于摄影机远(或阴影)进行控制的 最大距离 如果大于零),那么 0.0 是眼睛的位置和 1.0 阴影在远处结束的地方。两者之间存在分歧。默认值通常工作得很好,但是稍微调整第一个分割是很常见的,可以为关闭对象提供更多细节(如第三人称游戏中的角色)。

务必设置阴影 最大距离 根据现场需要。较低的最大距离将产生更好的阴影。

有时候,分裂和下一个之间的过渡看起来很糟糕。为了解决这个问题, “混合拆分” 选项可以打开,这会牺牲细节以换取更平滑的过渡:

../../_images/blend_splits.png

这个 “正常偏差” 当物体垂直于光线时,参数可用于固定自阴影的特殊情况。唯一的缺点是它使阴影变薄了。

../../_images/normal_bias.png

这个 “偏差分割比例” 参数可以控制远距离分割的额外偏差。如果自阴影仅发生在远处的拆分上,则此值可以修复它们。

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

  • 稳定的 :在相机移动时保持阴影稳定,靠近阴影边缘时出现在轮廓中的块保持原位。这是默认值,通常是需要的,但它会降低有效的阴影分辨率。

  • 优化 :尝试在任何给定时间达到可用的最大分辨率。这可能会导致阴影边缘出现“移动锯”效果,但同时阴影看起来更详细(因此这种效果可能非常微妙,可以被原谅)。

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

可以在“项目设置”->“渲染”->“质量”中更改平行光的阴影贴图大小:

../../_images/project_setting_shadow.png

增加它可以解决偏差问题,但会降低性能。阴影映射是一门调整的艺术。

泛光灯

泛光灯是一种点光源,在给定的半径内,在所有方向上呈球形发光。

../../_images/light_omni.png

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

为了解决这个问题,a 范围 与衰减函数一起引入。

../../_images/light_omni_params.png

这两个参数允许调整视觉效果,以便找到美观的结果。

../../_images/light_attenuation.png

全向阴影映射

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

泛光阴影可以渲染为 “双抛物面”或“立方体映射” . 前者渲染速度快,但会导致变形,后者更准确,但成本更高。

../../_images/shadow_omni_dp_cm.png

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

聚光灯

聚光灯类似于泛光灯,只是它们只向圆锥体(或“截止”)发射光。它们可以用来模拟手电筒、汽车灯、反光镜、光斑等。这种类型的光也会朝着它指向的相反方向衰减。

../../_images/light_spot.png

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

  • 角度 :光的光圈角度

  • 角度衰减 :圆锥体衰减,有助于软化圆锥体边界。

点阴影映射

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

阴影地图集

与具有自己阴影纹理的平行光不同,泛光灯和聚光灯被指定给阴影地图集的槽。此图集可以在“项目设置”->“渲染”->“质量”->“阴影图集”中配置。

../../_images/shadow_atlas.png

该分辨率适用于整个阴影图集。本图集分为四个象限:

../../_images/shadow_quadrants.png

可以细分每个象限以分配任意数量的阴影贴图;以下是默认细分:

../../_images/shadow_quadrants2.png

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

每帧,对所有灯光执行以下步骤:

  1. 检查灯是否在合适的插槽上。如果没有,则重新渲染并将其移动到较大/较小的槽中。

  2. 检查影响阴影贴图的任何对象是否已更改。如果是这样,请重新渲染灯光。

  3. 如果以上两种情况都没有发生,就什么也不做,阴影也不会被触及。

如果象限中的插槽已满,则灯光将被推回较小的插槽,具体取决于大小和距离。

这种分配策略适用于大多数游戏,但在某些情况下,您可能希望使用一个单独的策略(例如,一个自上而下的游戏,其中所有的灯都在相同的大小,象限可能都有相同的细分)。

阴影过滤器质量

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

../../_images/shadow_pcf1.png

它影响阴影轮廓的块状:

../../_images/shadow_pcf2.png