Skip to main content

在世界的一隅重写天空: 一种支持局部渲染与平滑过渡的天空盒组件 —— Skybox

Unity 内置天空盒 主要面向全局环境渲染,通常只能作为场景背景或环境光来源使用。在需要为局部区域、特殊空间、传送场景、室内外切换或非标准几何体提供天空盒效果时,内置天空盒的控制方式会受到限制,也不便于实现多套天空盒之间的平滑过渡。

本组件的设计目标是将天空盒从全局渲染设置中解耦出来,使创作者可以像使用普通材质一样,将天空盒纹理应用到任意网格上。这种方式允许创作者在同一场景中创建多个独立的天空盒区域,并对其颜色、曝光、旋转、纹理偏移以及 过渡效果 进行细粒度控制。

演示世界: https://vrchat.com/home/world/wrld_3a888003-76d0-4be7-a476-aba50288e5b3/info

示例

安装

  1. 下载 Xuan25-VRC-Common-Utilities 组件包,并将其导入到你的 Unity 项目中。该组件包包含 UdonTelemetry 组件以及一系列相关依赖组件。你可以使用 Git 将其 clone 到项目的 Packages 目录下,或者直接下载压缩包并将其解压到该目录中。

使用方法

简单天空盒

在场景中创建一个球体,并将其缩放到足够大,以包裹 整个场景 或场景中 预期使用该天空盒的区域。

在资源中创建一个材质,并将其着色器设置为 Xuan25/CylindricalSkybox 或 Xuan25/CubemapSkybox,具体选择哪个着色器取决于你使用的天空盒纹理类型(柱面投影或立方体纹理)。

然后将该材质应用到球体上。将天空盒纹理设置到材质的 Cylindrical (HDR) 属性上(对于柱面投影纹理)或 Cubemap (HDR) 属性上(对于立方体纹理纹理)。

此时,球体内侧应呈现天空盒纹理。

立方体纹理布局 柱面投影纹理布局 球面纹理布局
立方体纹理布局 (四种) 柱面投影纹理布局 球面纹理布局 (暂不支持)

(来源: Unity - Manual: Cubemaps)

静态天空盒

基于上述简单天空盒,可以通过调整 Tint Color、Exposure、Rotation 和 Tiling and Offset 属性来调整天空盒的视觉效果。

Enable LOD 选项允许启用 Mip Map 级别切换功能,以根据玩家 FOV 自动切换天空盒纹理的不同 Mip 级别。这可以在 FOV 较大时缓解纹理高频细节的混叠问题,但会带来一定的额外性能开销。

动态天空盒

通过对上述属性进行动画控制,可以实现动态天空盒效果。

天空盒过渡

除了 Cylindrical (HDR) 或 Cubemap (HDR) 属性之外,材质的 Alt Cylindrical (HDR) 或 Alt Cubemap (HDR) 属性还允许设置第二个天空盒纹理,并提供带有 Alt 前缀的对应属性,用于调整第二个天空盒纹理的视觉效果。

通过使用动画驱动 Blend Factor 属性,可以在两个天空盒纹理之间播放过渡切换动画。过渡模式可以通过 Blend Mode 属性进行设置。下面介绍当前支持的过渡模式。

原始天空盒 目标天空盒
原始天空盒 目标天空盒

Lerp 模式

在该模式下,两个天空盒纹理会根据 Blend Factor 属性进行线性插值混合,从而实现过渡效果。

Lerp
Lerp 过渡

Superposition 模式

在该模式下,目标天空盒的辐照会先逐渐增强并叠加到原始天空盒上,然后原始天空盒的辐照会逐渐降低,直到完全切换到目标天空盒,从而实现过渡效果。

Superposition
Superposition 过渡

ArgMax 模式

该模式又被称为亮度擦除模式。在该模式下,两个天空盒纹理的强度会根据 Blend Factor 属性进行调整,并始终显示亮度较高的天空盒纹理,从而实现过渡效果。

ArgMax Feather 属性允许设置 ArgMax 模式下的过渡边缘羽化范围,以避免过渡边缘过于锐利。

ArgMax_0.3 ArgMax_0.7
ArgMax 过渡 (Feather = 0.3) ArgMax 过渡 (Feather = 0.7)

Map 模式

在该模式下,两个天空盒纹理的切换会根据 BlendMap 属性中设置的遮罩纹理进行控制。遮罩纹理的红色通道会与 Blend Factor 属性进行比较,以判断每个像素应显示哪个天空盒纹理,从而实现过渡效果。

Blend Map Feather 属性允许设置 Map 模式下的过渡边缘羽化范围,以避免过渡边缘过于锐利。

Map_Mask
示例中使用的遮罩纹理
Map_0.01 Map_0.1
Map 过渡 (Feather = 0.01) Map 过渡 (Feather = 0.1)