基于物理的天空 (Physically Based Sky)
基于物理的天空可以模拟具有两部分大气的球形行星,其中大气的密度会相对于高度呈指数递减。这意味着高于海平面越高,大气密度就越小。有关此天空类型的实现方式的信息,请参阅实现详细信息。
模拟是作为预处理过程运行的,这意味着只会运行一次,而不是在每个帧上运行。模拟会计算光线和视角所有组合的大气散射,然后将结果存储在多个 3D 纹理中,Unity 在运行时对纹理进行重新采样。预计算是与场景无关的,并且仅取决于基于物理的天空的设置。
基于物理的天空的大气由两种类型的粒子组成:
- 具有 Rayleigh 散射的空气粒子。
- 具有各向异性 Mie 散射的气溶胶粒子。您可以使用气溶胶为污染、高度雾或雾气建模。
您可以使用基于物理的天空来模拟白天和晚上的天空。一天中的时间可以在运行时任意更改,而不会产生任何额外成本。以下各图显示了 Unity 的 Fontainebleau 演示中提供的基于物理的天空。有关 Fontainebleau 演示的更多信息,以及有关如何自行下载和使用该演示的说明,请访问 https://github.com/Unity-Technologies/FontainebleauDemo。请注意,在 2019.3 版中,可用的 Fontainebleau 演示仅使用基于物理的天空进行日间设置。
使用基于物理的天空
基于物理的天空使用体积 (Volume) 框架。要启用和修改基于物理的天空属性,必须将基于物理的天空覆盖添加到场景中的体积。要向体积添加基于物理的天空,请执行以下操作:
在 Scene 视图或 Hierarchy 视图中,选择一个包含 Volume 组件的游戏对象以在 Inspector 中查看该游戏对象。
在 Inspector 中,导航到 Add Override > Sky,然后选择 Physically Based Sky。
接下来,请设置体积以使用基于物理的天空。体积使用的天空类型由视觉环境 (Visual Environment) 覆盖进行控制。在视觉环境覆盖中,导航到 Sky 部分,然后将 Type 设置为 Physically Based Sky。HDRP 现在会为此体积所影响的任何摄像机渲染基于物理的天空。
要更改大气对光的衰减程度,可以更改大气中空气和气溶胶分子(参与介质)的密度。您还可以使用气溶胶模拟现实世界中的污染或雾气。
注意:Unity 初始化基于物理的天空时,它将执行资源密集型操作,这可能会导致项目的帧率下降几帧。一旦 Unity 完成此操作,它会将数据存储在缓存中以供 Unity 下次初始化该体积时使用。但是,如果两个“基于物理的天空”体积具有不同的属性,并在它们之间进行切换,则可能会遇到这种帧率下降的情况。
API
要在运行时访问和控制此覆盖,请使用体积脚本 API。由于体积系统的工作原理,可以使用与标准 Unity 组件不同的方式来编辑属性。也需要注意其他细微差别,例如每个属性都有一个 overrideState。这个参数向体积系统指示是使用你设置的属性值,还是使用存储在体积配置文件中的默认值。有关如何正确使用 API 的信息,请参阅体积脚本 API。
属性
要编辑任何 Volume 组件覆盖中的属性,请启用属性左侧的复选框。这也告诉 HDRP 使用您为 Volume 组件指定的属性值而不是使用默认值。如果禁用该复选框,HDRP 将忽略您设置的属性,并改用该属性在 Volume 组件中的默认值。
Model
属性 | 描述 |
---|---|
Type | 指示由 HDRP 用于简化 Inspector 的预设。如果选择 Earth (Simple) 或 Earth (Advanced),则 Inspector 仅显示适合于模拟地球的属性。 |
Planet
属性 | 描述 |
---|---|
Spherical Mode | 启用 Spherical Mode。在 Spherical Mode 下,您可以指定行星的位置。否则,行星将始终位于世界空间 x-z 平面中并在摄像机下方。 |
Planetary Radius | 行星的半径(以米为单位)。半径是从行星中心到海平面的距离。仅在 Spherical Mode 下可用。 |
Planet Center Position | 行星中心在世界空间中的位置(以米为单位)。这不会影响预计算。仅在 Spherical Mode 下可用。 |
Sea Level | 行星海平面在世界空间中的 y 坐标(以米为单位)。在 Spherical Mode 下不可用。 |
Planet Rotation | 行星的方向。 |
Ground Color Texture | 指定一个表示行星表面的纹理。 |
Ground Tint | 指定 HDRP 用于为 Ground Color Texture 着色的颜色。 |
Ground Emission Texture | 指定一个表示行星表面发射区域的纹理。 |
Ground Emission Multiplier | 一个由 HDRP 应用于 Ground Emission Texture 的乘数。 |
Space
要使此部分可见,请将 Type 设置为 Earth (Advanced) 或 Custom Planet。
属性 | 描述 |
---|---|
Space Rotation | 空间的方向。 |
Space Emission Texture | 指定一个表示空间发射区域的纹理。 |
Space Emission Multiplier | 一个由 HDRP 应用于 Space Emission Texture 的乘数。 |
Air
要使此部分可见,请将 Type 设置为 Custom Planet。
属性 | 描述 |
---|---|
Air Maximum Altitude | 从海平面到大气层(由空气粒子组成)的深度(以米为单位)。此属性可以控制基于高度的密度衰减率。HDRP 假定在此高度的空气密度很小,几乎可以忽略不计。 |
Air Density R | 观察者正上方天空位置(天顶)空气的红色通道不透明度。这直接影响天顶处的空气颜色。 |
Air Density G | 观察者正上方天空位置(天顶)空气的绿色通道不透明度。这直接影响天顶处的空气颜色。 |
Air Density B | 观察者正上方天空位置(天顶)空气的蓝色通道不透明度。这直接影响天顶处的空气颜色。 |
Air Tint | 空气分子的单个散射反照率(每个颜色通道)。值为 0 会产生吸收分子,而值为 1 会产生散射分子。 |
Aerosols
属性 | 描述 |
---|---|
Aerosol Maximum Altitude | 从海平面到大气层(由气溶胶粒子组成)的深度(以米为单位)。此属性可以控制基于高度的密度衰减率。HDRP 假定在此高度的气溶胶密度很小,几乎可以忽略不计。 |
Aerosol Density | 观察者正上方天空位置(天顶)气溶胶的不透明度。这直接影响天顶处的气溶胶颜色。 |
Aerosol Tint | 气溶胶分子的单个散射反照率(每个颜色通道)。值为 0 会产生吸收分子,而值为 1 会产生散射分子。 |
Aerosol Anisotropy | 指定各向异性的方向: • 将此值设置为 1 表示前向散射。 • 将此值设置为 0 可使各向异性几乎各向同性。 • 将此值设置为 -1 表示后向散射。 对于较高的各向异性值: • 如果光路和视图方向对齐,您将看到明亮的大气/雾效果。 • 如果它们未对齐,则会看到昏暗的大气/雾效果。 • 如果各向异性为 0,不论视角如何,大气和雾看起来都相似。 |
Artistic Overrides
属性 | 描述 |
---|---|
Color Saturation | 控制天空颜色的饱和度。 |
Alpha Saturation | 控制天空不透明度的饱和度。 |
Alpha Multiplier | 一个由 HDRP 应用于天空不透明度的乘数。 |
Horizon Tint | 指定 HDRP 用于为地平线天空着色的颜色。 |
Horizon Zenith Shift | 控制 HDRP 如何在 Horizon Tint 和 Zenith Tint 之间混合。如果将此值设置为 -1,则 Zenith Tint 会向下扩展到地平线。如果将此值设置为 1,则 Horizon Tint 会向上扩展到天顶。 |
Zenith Tint | 指定 HDRP 用于为观察者正上方天空位置(天顶)着色的颜色。 |
Miscellaneous
属性 | 描述 |
---|---|
Number Of Bounces | 散射事件的数量。这不仅可以提高天空视觉效果的质量,还会增加预计算时间。 |
Intensity Mode | 使用下拉选单选择 HDRP 计算天空强度的方法: • Exposure:HDRP 根据 EV100 中的曝光值计算强度。 • Multiplier:HDRP 通过单位乘数计算强度。 |
- Exposure | HDRP 作为环境光应用于场景的曝光。HDRP 使用 2 的幂次方(指数为 Exposure 值)来计算场景中的环境光。 |
- Multiplier | HDRP 作为环境光应用于场景的乘数。HDRP 将场景中的环境光乘以此值。要使此属性可见,请将 Intensity Mode 设置为 Multiplier。 |
Update Mode | HDRP 更新天空环境的速率(使用环境探针和反射探针): • On Changed:当其中一个天空属性发生变化时,HDRP 更新天空环境。 • On Demand:HDRP 等待,直到您从脚本手动调用天空环境更新。 • Realtime:HDRP 按照 Update Period 定义的定期间隔更新天空环境。 |
- Update Period | HDRP 更新天空环境的周期(以秒为单位)。如果希望 HDRP 每帧都更新天空环境,请将值设置为 0。仅当 Update Mode 设置为 Realtime 时,才显示此属性。 |
Include Sun In Baking | 指示为天空生成的光照探针和反射探针是否包含太阳圆盘。有关为何此属性很有用的详细信息,请参阅环境光照。 |
实现详细信息
这种天空类型是论文《预计算的大气散射》(Precomputed Atmospheric Scattering)(作者 Bruneton 和 Neyret,2008 年)中所述方法的实际实现。
此方法假定你始终从行星表面上方观看场景。这意味着,如果摄像机低于行星表面,则天空的渲染方式就像摄像机处于地平面时一样。行星表面的位置取决于是启用还是禁用 Spherical Mode:
- 如果启用 Spherical Mode,则由 Planetary Radius 和 Planet Center Position 属性定义表面的位置。在此模式下,表面与 Planet Center Position 中设置的位置之间的距离为 Planetary Radius 中设置的距离。
- 否则,由 Sea Level 属性定义表面的位置。在此模式下,表面在 xz 平面上无限延伸,并由 Sea Level 设置其世界空间高度。
两种模式下的默认值都能使行星的表面在场景原点的 y 轴上处于 0 位置。由于 Spherical Mode 的默认值模拟地球,因此半径极大,以至于在创建场景环境时可以认为表面是平坦的。如果您希望场景环境中的某些区域低于当前表面高度,则可以垂直偏移场景环境以使最低区域在 y 轴上高于 0,或者减小表面高度。要采取后一种方法,请执行以下操作:
如果在 Spherical Mode 下,请减小 Planetary Radius,或向下移动 Planet Center Position。
如果不在 Spherical Mode 下,请降低 Sea Level。
参考列表
- Bruneton、Eric 和 Fabrice Neyret。2008 年。“Precomputed Atmospheric Scattering”。Computer Graphics Forum 27,编号 4 (2008):1079–86。https://doi.org/10.1111/j.1467-8659.2008.01245.x。