Skip to content

简介

天空盒(Skybox)是一个包裹整个场景的立方体,是 摄像机(Camera)在渲染帧场景之前绘制的一种背景,可以很好地渲染并展示整个场景的环境。

【Skybox001.png】

添加天空盒后场景的演示效果。

显示天空盒

SandMod 编辑器默认状态下所有 摄像机(Camera)都会渲染并显示天空盒,如果 场景预览窗口(Scene)中天空盒显示正常,但是运行游戏项目时天空盒不显示,您可以查看当前渲染画面的摄像机,选中摄像机对应的 游戏对象(Game Object)后,在 检视窗口(Inspector)中查看 摄像机(Camera)组件(Component)的 清除标志(Clear Flags)值设置为 天空盒(Skybox)。

【Skybox002.png】

天空盒配置方法

配置默认天空盒

默认天空盒支持通过调整场景中 定向光(Directional Lights)的 旋转变换(Rotation)改变天空盒的外观和光照氛围,系统会根据定向光的方向实时变化为晴空、黄昏和黑夜。

【Skybox003.gif】

旋转场景中的定向光时,默认天空盒实时变化的效果。

配置自定义天空盒

配置自定义天空盒前请确游戏项目中已经有用于储存天空盒纹理的 立方体贴图资产(Cubemap Asset),具体创建和编辑方法请参阅 立方体贴图资产 章节。自定义天空盒配置方法如下:

  • 在 菜单栏(Menu)中点选 窗口(Window) > 渲染器(Renderer) > 光源(Light) 显示光照编辑窗口。

【Lighting_Window002.png】

  • 在光照编辑窗口中跳转 环境模块(Environment Tab),并找到 天空盒(Skybox)属性,设置该属性的值为 立方体贴图(Cube Map)。

【Skybox004.png】

  • 此时光照编辑窗口中的 立方体贴图(Cube Map)属性为可编辑状态,将需要配置的立方体贴图资产分配至该属性中,完成天空盒的自定义配置。

【Skybox005.png】

值得注意的是,自定义天空盒无法根据场景中 定向光(Directional Lights)的 旋转变换(Rotation)改变天空盒的外观。

天空盒着色器

SandMod 编辑器提供了多个天空盒相关的 着色器(Shader),您可以在 材质(Material)中使用它们。每个着色器都提供不同的可配置属性,以及使用不同的生成技术。

【Skybox006.png】

在新创建的材质中选取天空盒相关着色器。

立方体贴图着色器

立方体贴图着色器:Skybox(Engine/Skybox),是根据 6 个纹理生成的 立方体贴图(Cube Map),纹理对应的 2D 贴图资产代表来自各个方向的天空盒视图。

立方体贴图着色器包含以下可配置属性,您可以将该着色器附加至控制天空盒的材质中设置相关属性:

【Skybox007.png】

名称描述
立方体贴图(_cubemap)附加到天空盒的 立方体贴图资产(Cube Map Asset)。立方体贴图资产的创建和使用方法,请参阅 立方体贴图资产 章节。

程序化着色器

程序化着色器:Procedural(Engine/Skybox/Procedural),不使用纹理渲染天空盒,而是使用材质上的属性来生成天空盒。

程序化着色器包含以下可配置属性,您可以将该着色器附加至控制天空盒的材质中设置相关属性:

【Skybox008.png】

名称描述
太阳尺寸(_SunSize)设置太阳的尺寸。属性值为 0 至 1 之间的浮点数,默认值是 0.04。
大气密度(_AtmosphereThichness)设置大气的密度。属性值为 0 至 5 之间的浮点数,默认值是 0.53。更高密度的大气吸收更多光线。
天空颜色(_SkyTint)地平线以上的区域默认为天空,本属性用于设置天空的颜色。
地面颜色(_GroundColor)地平线以下的区域默认为地面,本属性用于设置地面的颜色。
曝光度(_Exposure)调整天空的曝光程度,更改对应天空盒的色调值。属性值为 0 至 8 之间的浮点数,默认值是 1.25。值越大,产生曝光更强,天空盒看起来更亮;值越小,生生曝光越弱,天空盒看起来更暗。

动态配置天空盒

动态配置天空盒前,您需要有分配了天空盒 着色器(Shader)的 材质(Material),天空盒着色器的创建和设置方法请参阅 天空盒着色器 小节。

在脚本中,通过 Resources.Load(Type,ID) 代码可以根据分配了天空盒 着色器(Shader)的 材质资产(Material Asset)的 ID 动态获取 Material 类型的材质资产。详情请参阅 API 文档 Resources.Load(Type,ID) 的相关内容。随后通过 RenderSettings.SetSkybox(SkyboxType,Material) 方法读取天空盒材质的信息,并根据该信息渲染天空盒。详情请参阅 API 文档 RenderSettings.SetSkybox(SkyboxType,Material) 的相关内容。

若需要获取材质资产的 ID,可以在 项目窗口(Project)中用鼠标指向对应的材质资产,点击鼠标右键打开该材质资产的上下文菜单,点击 复制资源 ID(Copy Asset ID) ,即可复制选中的材质资产的 ID 至剪贴板中。

【Skybox009.png】

假设分配了天空盒着色器的材质资产 ID 为 "Material001UUID" ,且该着色器为立方体贴图着色器:Skybox(Engine/Skybox)。使用此天空盒材质渲染场景天空盒的代码示例如下:

typescript
class SkyRendering extends Component {
    //天空盒材质资产的上下文菜单 复制资源 ID(Copy Asset ID)后得到资源 ID 为:Material001UUID

    //定义私有变量保存天空盒材质资产;
    private _skyMaterial:Material;
    //定义私有变量保存天空盒类型;
    private _skyType:SkyboxType;

    OnStart(): void {
        //根据天空盒材质资产的 ID 获取材质资产并将其保存为 _skyMaterial 私有变量;
        this._skyMaterial = Resources.Load(Material,"Material001UUID");

        /*
        天空盒材质所分配的着色器为立方体贴图着色器:Skybox(Engine/Skybox),类型为 Cubemap;
            * 如果着色器为程序化着色器:Procedural(Engine/Skybox/Procedural),类型为 Procedural;
        */
        this._skyType = SkyboxType.Cubemap;

        //使用该天空盒材质渲染场景天空盒;
        RenderSettings.SetSkybox(this._skyType,this._skyMaterial);
    }

    OnUpdate(): void {
    }

}