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/CylindricalSkyboxXuan25/CubemapSkybox,具体选择哪个着色器取决于你使用的天空盒纹理类型(柱面投影或立方体纹理)。

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

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

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

(来源: Unity - Manual: Cubemaps)

静态天空盒

基于上述简单天空盒,可以通过调整 Tint ColorExposureRotationTiling 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)