天空是摄像机在渲染之前绘制的一种背景类型。此类型的背景对于 3D 游戏和应用程序非常有用,因为它可以提供深度感,使环境看上去比实际大小大得多。天空本身可以包含任何对象(例如云、山脉、建筑物和其他无法触及的对象)以营造遥远三维环境的感觉。Galacean 还可以将天空用于在场景中产生真实的环境光照,详情可参考烘焙。
天空模式下,开发者可以自行设置材质
和网格
,通过 Galacean 内置的天空盒
与程序化天空
可以一键设置期望的天空效果。
在编辑器中,只需按照如下步骤即可为背景设置天空盒:
可以在 Poly Haven 或 BimAnt HDRI 下载免费的 HDR 贴图
天空盒纹理就是一张立方纹理,首先在准备好 HDR 后,依照路径 资产面板 -> 右键上传 -> 选择 TextureCube(.hdr) -> 选择对应 HDR 贴图 -> 立方纹理资产创建完毕 操作即可。
创建完立方纹理资产后,依照路径 资产面板 -> 右键创建 -> 选择 Material -> 选中生成的资产 -> 检查器面板 -> 点击 Base 栏的 Shader 属性 -> 选择 Sky Box -> 点击 Base 栏的 HDR -> 选择第一步创建的立方纹理 创建天空盒材质。
最后只需依照路径 层级面板 -> 选中 Scene -> 检查器面板 -> Background 栏 -> Mode 设置 Sky -> Material 选择第二步创建的材质 -> Mesh 设置内置的 Cuboid 可以看到场景的背景变成了天空盒。
// 创建天空盒纹理
const textureCube = await engine.resourceManager.load<TextureCube>({
urls: [
"px - right 图片 url",
"nx - left 图片 url",
"py - top 图片 url",
"ny - bottom 图片 url",
"pz - front 图片 url",
"nz - back 图片 url",
],
type: AssetType.TextureCube,
});
// 创建天空盒材质
const skyMaterial = new SkyBoxMaterial(engine);
skyMaterial.texture = textureCube;
// 设置天空盒
const background = scene.background;
background.mode = BackgroundMode.Sky;
background.sky.material = skyMaterial;
background.sky.mesh = PrimitiveMesh.createCuboid(engine, 2, 2, 2);
程序化天空是编辑器在 3D 项目中的默认背景,您也可以依照路径 层级面板 -> 选中 Scene -> 检查器面板 -> Background 栏 -> Mode 设置 Sky -> Material 选择内置的 SkyMat 材质 -> Mesh 设置内置的 Sphere
// 创建大气散射材质
const skyMaterial = new SkyProceduralMaterial(engine);
// 设置天空盒
const background = scene.background;
background.mode = BackgroundMode.Sky;
background.sky.material = skyMaterial;
background.sky.mesh = PrimitiveMesh.createSphere(engine);
在大气散射材质的 检查器面板 可以看到很多可调整的属性:
内置的大气散射材质无法随意调整属性,开发者可以自行创建并调整。
属性名称 | 解释 |
---|---|
exposure | 天空的曝光,值越大天空越亮。 |
sunMode | 天空中生成太阳所使用的方法,包含 None ,Simple 和 HighQuality ,其中 None 不生成太阳,Simple 生成简单的太阳,而 HighQuality 生成可定义外观的太阳。 |
sunSize | 太阳的尺寸,值越大太阳越大。 |
sunSizeConvergence | 太阳的大小收敛,当且仅当太阳的生成模式为 HighQuality 时有效 |
atmosphereThickness | 大气的密度,更高的密度会吸收更多的光线 |
skyTint | 天空的颜色 |
groundTint | 地面的颜色 |