如果你是一位环境美术或独立开发者,想在 UE5.7.4 里搭一个有“叙事感”的山地场景——不是单纯拷贝一张风景照,而是清晨雾气从林间升起、山脊线在逆光里变成剪影、一条被脚步踩出的土路消失在森林尽头——那么这篇教程会很有用。
“山地日记”这个方向,近几年在虚拟制片、独立游戏和数字孪生演示里都很常见。它和“写实大场景”最大的区别在于:场景不是用来展示地形雕刻技巧,而是用来传递情绪和记录空间。换句话说,地形是骨架,材质是皮肤,光照和大气才是让山“开口说话”的关键。
这篇文章会从 UE5.7.4 的项目配置开始,依次拆解地形创建、山体材质分层、植被散布、体积雾和后期处理,最后给出运行验证和常见问题排查思路。全程以“能照着做出来”为标准,不做过度复杂的实验性尝试。
1. 这篇文章真正要解决的问题
很多新手第一次在 UE 里做自然环境,喜欢直接找一张大地图模板,然后刷草、刷树、调个太阳,结果一运行发现:远处山体像塑料模型,近处植被没有层次,雾和光的关系完全不对,整体画面又灰又平。
这不是美术能力的问题,而是缺少一条完整的“环境工作流”。
“山地日记”场景的难点并不在某一个环节,而是多个环节之间的耦合关系:
- 地形形状决定了 Sun Angle 和雾的遮挡关系;
- 地形材质的高度混合决定了山体是否生硬;
- 植被密度和大小决定了空间层次感;
- 体积雾和大气散射决定了画面是“透”还是“闷”;
- 后期处理体积里的曝光和颜色分级,决定场景是否统一。
如果你正在做下面这些项目,这篇文章会比较适用:
- 独立游戏里的野外关卡或新手村场景;
- 虚拟制片里的户外舞台背景;
- 建筑可视化里的山地景观展示;
- 想做环境美术作品集但不知道如何开始的开发者。
读完这篇文章,你应该能搭建出一个完整的山地区域,并掌握一套可复用的环境创作顺序。
2. UE5.7.4 环境创作的底层变化
UE 5.x 系列最大的变化,是把过去需要大量手工处理的内容变成了近乎“开箱即用”的管线。到了 5.7.4 这个迭代版本,环境创作流程稳定了很多,特别体现在下面几个方面。
2.1 几何体系统:Nanite 与资产复杂度
过去做山体,我们习惯用 Landscape 雕刻大形,用静态网格体去拼岩石细节。现在 Nanite 可以让高模岩石、山体表面细节直接进入场景渲染管线,不需要手动做 LOD。这意味着场景密度可以做得更高,而且不用像过去那样花大量时间在 LOD 设置和 draw call 优化上。
不过在“山地日记”这种偏叙事的环境里,Nanite 并不一定全场景都要开。树木和草这类植被仍然建议使用传统 foliage,因为植被需要随风摆动动画,而 Nanite 目前对这类动态变形的支持仍有限。
2.2 动态全局光照:Lumen
Lumen 让室外场景的间接光照不再依赖繁琐的 Lightmass 烘焙。山体之间的反弹光、树林里的透射光、悬崖背阴面的补光,这些都能在运行时动态计算。
对于“山地日记”这种一日之内光线变化明显的场景,Lumen 的优势非常突出:你可以直接把太阳角度从清晨调到黄昏,整个山体的光照关系会跟随变化,不需要重新烘焙。
2.3 程序化内容生成:PCG
UE 5.2 之后 PCG(Procedural Content Generation)逐渐成熟,到 5.7.4 已经是环境美术的常用工具。
但这里要泼一盆冷水:PCG 不等于一键生成完美场景。它适合做“大范围但随机性要求不高”的散布,比如山坡上的碎石、森林里的低矮灌木。而需要精心控制视觉构图的位置,比如登山小径附近的几棵松树、视野中心的一块孤岩,仍然需要手动摆放。
2.4 开放世界与 Level Instance
如果“山地日记”想要扩展成多张地图组成的开放世界,5.7.4 里的 World Partition + Level Instance 可以让多人协作更高效。
不过这篇教程先聚焦单张地图的小场景搭建,避免一开始就陷入关卡流送的复杂度。
3. 环境准备与项目基础配置
3.1 创建项目
在 UE 5.7.4 启动器里选择“Game”类空模板:
- 项目类型:Blank
- 目标平台:Desktop
- 质量预设:Scalable(后面手动调整)
- 是否启用新手内容:否
项目名可以叫MountainDiary。命名建议全小写,避免后续写路径时出现大小写问题。
3.2 启用插件
在 Edit -> Plugins 中搜索并启用以下插件:
| 插件 | 作用 | 优先级 |
|---|---|---|
| PCG | 程序化生成植被和碎石 | 高 |
| Water | 如果场景需要溪流或湖泊 | 中 |
| Landscape Modeling Tools | Landscape 建模辅助 | 高 |
| Foliage Tool | 植被笔刷和实例化 | 高 |
| Volumetric Clouds | 体积云 | 高 |
| Movie Render Queue | 最终序列帧输出 | 中 |
启用后重启编辑器。
3.3 基础渲染设置
在 Project Settings -> Rendering 中确认:
- Dynamic Global Illumination Method:Lumen
- Reflection Method:Lumen
- Virtual Texture:开启
- Support Virtual Texture:开启
- Auto Exposure:开启 Extend Default Luminance Range
室外场景建议打开体积雾和体积云:
# 在 Output Log 或控制台输入 r.VolumetricFog 1 r.VolumetricCloud 1 r.Lumen.DiffuseIndirect.Allow 1 r.Shadow.Virtual.Enable 1注意:这些是运行时控制台命令。如果想要项目默认开启,可以写到DefaultEngine.ini的[/Script/Engine.RendererSettings]段,不过不同小版本配置写法略有差异,建议先在编辑器里打开相关开关再确认。
3.4 目录结构建议
在 Content 目录下创建:
Content/ ├── Maps/ ├── Landscape/ ├── Materials/ │ ├── Terrain/ │ ├── Foliage/ │ └── FX/ ├── Foliage/ ├── Meshes/ ├── PCG/ └── PostProcess/这个结构不复杂,但能让后续文件引用不混乱。
4. 用 Landscape 创建山地地形
4.1 创建 Landscape
在 Place Actors 面板里找到 Landscape,拖入场景。或者通过 Mode 面板切换到 Landscape 模式。
关键参数:
- Scalar:1m 或 100m 取决于项目比例尺
- Section Size:127x127
- Sections:1x1
- Subsections:1x1
如果地图目标尺寸是 1000m x 1000m,直接用 127 分辨率的 Landscape 会显得很粗糙。建议分辨率设置为 507 或 1009,也就是在 127 基础上增加 subdivision。
一次把分辨率调够,比后面用 Recalculate Normals 补救要省事得多。
4.2 整体形状雕刻
用 Landscape 的 Sculpt 工具,把笔刷形状调成 Soft Low,强度降低到 0.2 左右。
“山地日记”场景通常需要三条山脊线,围成一个半封闭的山谷,山谷中间留出步行路径。雕刻流程建议:
- 先用大笔刷铺出山脉走向,只考虑大形,不考虑细节;
- 在山谷两侧刷出山肩,形成从高到低的梯度;
- 用 Flatten 工具在山腰处修出一些台地,方便后面放植被和路径;
- 用 Erosion 工具做风化感;
- 最后用小笔刷在岩石露头的地方雕刻破碎感。
这一步慢一点比较好。地形大形如果不对,后续材质和植被都不能救回来。
4.3 添加 Landscape Layer
在 Landscape 模式下切到 Paint 页签,添加三层 Layer:
- GroundLayer(泥土/碎石)
- RockLayer(山体岩石)
- GrassLayer(草坡)
每一层都要关联对应的地形材质,材质稍后创建。
4.4 用 Landmass 做山体轮廓修正
Landmass 插件允许通过蓝图样条线切割或叠加山体形状。对于“山地日记”这种叙事场景,可以用 Landmass 加一个视觉焦点:
- 在视野尽头放一条低缓的 Mountain Range Spline;
- 把它的 Height 参数调低,用来挡住地平线后面的空白区域;
- 配合距离雾,让远山产生空气透视。
这样整个场景的纵深感会强很多。
5. 山体材质与地形混合
5.1 创建 Terrain Material
在 Material 编辑器中新建材质,命名为M_Terrain_Base。
设置:
- Shading Model:Default Lit
- Blend Mode:Opaque
- Material Domain:Surface
打开 5.1 之后推出的 Landscape Material 混色模式,使用 Weight Map 节点。
你的材质中将添加:
- Texture Sample 节点:Ground、Rock、Grass 三套贴图
- LandscapeLayerWeight 节点:分别接收这三套贴图
- LandscapeLayerCoords 节点:控制 UV 重复
连接方式:
- LandscapeLayerWeight(Ground) -> Layer0
- LandscapeLayerWeight(Rock) -> Layer1
- LandscapeLayerWeight(Grass) -> Layer2
5.2 用高度混合解决接缝问题
如果只靠 LayerWeight 混色,靠近岩石和草地交界的地方会出现一条生硬的分界线。
解决办法是“高度混合”,也就是把两张贴图的 Height 高度信息也参与权重计算。
在 Material 中可以使用HeightBlend节点:
// 简化节点逻辑 float GroundHeight = TextureObject2DSample(GroundTex, UV).a; float RockHeight = TextureObject2DSample(RockTex, UV).a; float BlendMask = HeightLerp(GroundHeight, RockHeight, LayerWeight, Softness);HeightLerp 并不是默认可选的节点,实际工程里一般用MaterialFunctionLibrary里自带的高度混合函数,或者在 Custom 节点里写一小段 HLSL。
给一个最小可行的 Custom 节点示例:
// Custom 节点,输入参数:BaseA, BaseB, HeightBlend float BlendWeight = saturate((HeightA - HeightB) * HeightBlendStrength + 0.5); return lerp(TexA, TexB, BlendWeight);在节点里的正确做法是分别采样两张贴图,然后把结果交给一个完整的 HeightBlend 材质函数。这部分习惯可以直接参考 UE 官方 Learn 项目里的地形材质。
5.3 材质纹理密度
室外场景 1m 单位下,纹理密度建议:
- 近处地面:每米 1-2 个 Tile
- 岩石:每米 2-4 个 Tile
- 远处山体:每米 0.5-1 个 Tile
如果全部用高密度纹理,远处山体会产生严重摩尔纹。所以地形材质一般会用一个DistanceBlend混合第二套低密度纹理。
在 LandscapeLayerCoords 节点里调整 Scale 即可,近处写 0.1,远处写 0.5。
5.4 使用地形材质实例
用MaterialInstanceConstant而不是直接修改材质:
- 创建三个材质实例:MI_Terrain_Mountain、MI_Terrain_Valley、MI_Terrain_Path;
- 分别调整三层的颜色与粗糙度;
- 在 Landscape 材质里可以按比例混合这些实例。
这样做的好处是可以根据光照验证,随时微调山体颜色,而不用打开庞大的 Material 编辑器。
6. 植被散布与氛围道具
6.1 场景植被规划
“山地日记”不是原始森林,更像是一个有人活动痕迹的山地环境。所以植被要考虑“可读性”:
- 山谷底部是低矮草地和稀疏灌木;
- 山腰是松树和阔叶树的混合;
- 山脊线和岩石露头区域不种树,留出透气感;
- 路径两侧可以放倒下的枯树干,让场景有故事感。
打开 Foliage 模式的 Paint 页签,添加植物类型:
| 网格体 | 用途 | 旋转随机 | 缩放范围 |
|---|---|---|---|
| SM_Pine | 远处山体松树 | 开 | 0.8 - 1.4 |
| SM_Bush | 山腰灌木 | 开 | 0.6 - 1.1 |
| SM_Grass_Clump | 山谷草簇 | 开 | 0.7 - 1.5 |
| SM_Rock_Small | 碎石 | 开 | 0.5 - 2.0 |
| SM_Dead_Log | 枯木 | 关 | 1.0 - 1.2 |
密度不要一味追求高。在“山地日记”这类偏写实且有镜头叙事的场景里,稀疏但有层次的植被比密集但混乱的植被效果好得多。
6.2 手动放置关键植物
虽然 Foliage 笔刷效率高,但关键视觉点需要手动摆放:
- 登山路径转角处的导向树;
- 山顶地标性的大型松树;
- 山谷入口处形成“画框”的两棵树。
这些树要单独调整朝向、比例和曲率,让它们看起来有生命感,而不是复制粘贴的。
6.3 使用 PCG 补充大区域植被
在场景中放一个 PCG Volume,覆盖山脚到半山腰。
PCG 图结构可以做得很简单:
PCG Volume -> Point Generator -> Density Noise(根据地形高度和坡度过滤) -> Transform Points(随机缩放旋转) -> Spawn Foliage / Spawn Static Mesh具体节点配置在 5.7.4 里略有差异,核心思路是:
# PCG 节点链 PCGVolume Get Landscape Layer Weight (Grass) Point Generator Density Noise Transform Points - Scale Min=0.7, Max=1.3 - Rot Min=0, Max=360 Spawn Foliage用 PCG 做碎石和远山植被,效率很高。但 PCG 生成的植被不稳定,刷新后可能变化,因此对于需要构图精确的点,仍然应该用 Foliage 手动刷。
6.4 植被风动画
如果你的树和草使用SimpleGrassWind或PivotPainterWind材质,风吹动会比较自然。
UE 5.7.4 自带的风力控制器可以通过 World Settings 统一调强度。
7. 光照、大气与“日记感”后期处理
7.1 主光源方向光
在场景放置一个 Directional Light,设定清晨角度:
- Light Source Angle:约 1 度
- Intensity:8-12 lux
- Color Temperature:暖色靠近 3000-3500K
- Atmosphere Sun Light:开启
“山地日记”如果做清晨场景,太阳位置放在山谷一侧,让脊线形成侧逆光。
7.2 体积云
新建 Volumetric Cloud 组件,选择默认预设后调整密度:
- Cloud Strength:0.6
- Cloud Map Scale:越大云层越稀疏
- Weather Map:选一张简单的断裂云贴图
云的阴影投射到山体上,是让大场景不假的关键。
7.3 指数高度雾
Exponential Height Fog 负责空气透视。参数建议:
- Fog Density:0.02-0.05
- Fog Inscattering Color:淡蓝紫色
- Volumetric Fog:开启
- Volumetric Fog Distance:10000
- Start Distance:500
距离雾会让山脊线从深色逐渐变淡,形成强烈的纵深。雾的颜色不要用纯白,偏一点大气的天光是关键。
7.4 后期处理体积
在场景中加入 Post Process Volume,并设为 Infinite Extent:
关键参数:
- Auto Exposure:Min 2,Max 14
- Color Grading -> Saturation:1.0-1.1
- Color Grading -> Gamma:0.95
- Color Grading -> Gain:偏一点青或暖
- Bloom:0.3-0.5
- Vignette:0.2-0.4
想要“日记感”,核心是统一色温和轻微胶片感,不要让场景某一区域的对比度突然爆掉。
# 检查曝光状态 r.EyeAdaptation.ExposureCompensation 0 r.EyeAdaptation.PreExposureOverride 07.5 用蓝图触发一天时间变化
如果你想让“山地日记”具有动态叙事,新建一个 Actor Blueprint,用 Timeline 控制方向光的旋转和强度,同时联动半球天空颜色和雾色。
这一步不是必须的,但会显著提升场景展示效果。
8. 运行验证与性能优化
8.1 快速运行检查
点击 Play 后不要急着截图,先依次看这几项:
- 场景内是否有黑面或材质错误;
- 远山是否变灰白(雾过浓);
- 植被是否出现大面积闪烁(LOD 问题);
- 曝光是否稳定;
- 帧率是否稳定在目标值。
8.2 渲染统计
打开控制台输入:
stat unit stat rhi stat landscape stat foliage重点关注 Draw Primitive Count 和 Static Mesh Draw Count。大部分卡顿来自植被实例数量过高。
8.3 常见优化手段
- 减少 PCG 生成的实例数量,用密度或距离裁剪的方式控制;
- 植被 LOD 距离调整到合理范围;
- 开启 Nanite 的岩石网格体;
- 阴影距离缩短,远处的山不需要投射实时阴影;
- 体积云的分辨率可以降低,不影响远景效果。
8.4 截图与录屏
如果只是展示,可以直接用高分辨率截图:
r.ScreenPercentage 200建议直接使用 Movie Render Queue 输出高质量 PNG 序列,再合成成视频或长图。
9. 常见问题与排查方法
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 地形看起来很平 | 雕刻强度太低或笔刷过小 | 检查 Landscape 模式下 Sculpt 参数 | 用大笔刷重新雕刻主结构 |
| 山体材质接缝明显 | 缺少高度混合 | 检查材质中的 HeightBlend 节点 | 用高度混合函数处理交界 |
| 植被闪烁 | LOD 切换距离过近 | 观察运行时 LOD 状态 | 调整 LOD 距离 |
| 体积雾导致性能暴跌 | 体积雾分辨率过高 | 查看 r.VolumetricFog.GridPixelSize | 适当降低分辨率 |
| 曝光忽明忽暗 | 自动曝光范围太窄 | 检查 Post Process 参数 | 扩大 Min/Max 曝光范围 |
| 远景泛白 | 雾密度过大 | 调整 Exponential Height Fog | 降低密度或 StartDistance |
| 材质在远山出现摩尔纹 | 纹理密度太高 | 调整 LandscapeLayerCoords | 使用 DistanceBlend 混合低密度纹理 |
| PCG 生成位置出现穿插 | 密度噪声没有排除坡度 | 检查 Slope Filter 节点 | 限制最小/最大倾斜角 |
| 植物不与地面贴合 | 没有启用 Align to Normal | 在 Foliage 类型属性中调整 | 开启 Align to Surface Normal |
| 草太密导致看不到路径 | 路径区域的植被权重过高 | 用 Landscape Layer 画笔清理 | 将路径区域的植被 LayerWeight 调低 |
10. 最佳实践与后续学习方向
10.1 环境创作顺序
一个比较成熟的工作流顺序是:
- 确定叙事主题和一天中的时间;
- 用 Landscape 雕刻大形;
- 创建基础地形材质;
- 手动摆放关键构图物体;
- 用 Foliage/PCG 补充密集植被;
- 调整光照、大气和后期处理;
- 用序列器固定镜头验证构图;
- 性能优化。
这套顺序的核心是先保证构图和叙事,再填充密度,最后优化性能。反过来做往往会陷入反复返工。
10.2 工程管理建议
- 所有命名统一前缀,方便过滤;
- 材质实例化,不直接改母材质;
- 使用 Level Instance 划分区域,多人协作不会冲突;
- 在提交前清理空的 Actor 和未使用的贴图。
10.3 继续深入的方向
如果你对“山地日记”环境创作感兴趣,下一步可以探索:
- River 水体:用 Water 插件在山谷里加一条浅溪,提升环境生命力;
- 天气系统:用 Niagara 实现雨滴和云雾飘动;
- Blueprint 交互:让角色沿着山路行走时有脚印或草丛被压低的效果;
- 序列器:制作一条 30 秒的摄像机运镜,展示从清晨到黄昏的环境变化。
UE 的环境创作并不是某个单一工具能做到极致,它更像是一条由地形、材质、植被、光照共同串联起来的工作流。“山地日记”只是其中一种场景方向,但掌握这条工作流之后,你完全可以把它迁移到草原、荒漠或者雪地环境里。
不要一开始追求大而全,先在一个 500x500 的小范围里把整套流程跑通,这个过程中的经验和文档积累,会比盲目堆场景规模更值得。