3 个文件 · 三层雾 Screen Blend 叠加 · Raymarch 丁达尔光柱 · 40+ 参数 · 拖入即用
为任意 URP 项目添加距离雾、高度沉积雾、3D 噪波流云和真实体积光效果
仅 3 个独立文件,无外部依赖,放入项目即可工作
VolumeFog/
├── DepthFog.shader HLSL 核心 · 三层雾 + 体积光 Raymarch
├── DepthFogVolume.cs Volume 面板 · 40+ 可调参数
└── DepthFogFeature.cs Feature + Pass · URP 入口 + 渲染执行
Textures/
├── Fog3DNoise.asset Texture3D 噪波贴图(128³,大块云,推荐)
└── BuleNoise64.asset Texture3D 噪波贴图(64³,轻量版,性能优先)
VolumeFog效果图.png 效果截图
VolumeFog技术文档.md 完整技术文档
README.md 本文件
┌────────────────────────────────────────────┐
│ ③ 噪波流云 3D 纹理掏孔 → 云块感 │
│ ② 高度雾 低洼沉积 → 山谷雾气 │
│ ① 距离雾 Linear / Exp / Exp2 衰减 │
├────────────────────────────────────────────┤
│ 三层通过 Screen Blend 物理叠加,互不干扰 │
├────────────────────────────────────────────┤
│ ④ 太阳散射 高光耀斑 + Raymarch 丁达尔 │
│ ⑤ 天空盒接管 无限远天空染上雾色 │
└────────────────────────────────────────────┘
| 🏷️ 特性 | 🛠️ 实现 | 💡 亮点 |
|---|---|---|
| 三层独立叠加 | 距离雾 / 高度雾 / 噪波雾分别计算 | Screen Blend 物理合成,亮度不溢出 |
| Exp² 距离衰减 | 1 - exp(-(d·ρ)²) |
近处通透、远处骤浓,最接近现实 |
| 3D 噪波流云 | Texture3D 采样 + 湍流域畸变 | 云块掏孔、随风飘动、距离淡出 |
| 体积光 Raymarch | 沿视线步进采样阴影贴图 | HG 相位函数 + 消光系数,真实丁达尔 |
| 蓝噪声 Dither | 步进起点打散 | 消除 Raymarch 条纹 Banding |
将 VolumeFog/ 和 Textures/ 两个文件夹整体拷贝到 Unity 项目的 Assets/ 目录下(最终路径为 Assets/VolumeFog/ + Assets/Textures/)。
| 步骤 | 操作 |
|---|---|
| a | 在 Project 中找到 URP Renderer 资产(Assets/Settings/ 下) |
| b | Inspector → Add Renderer Feature → 选 Depth Fog Feature |
| c | 把 DepthFog.shader 拖入 Feature 的 m_FogShader 字段 |
| 步骤 | 操作 |
|---|---|
| a | Hierarchy 右键 → Volume → Global Volume |
| b | Volume 面板 → Add Override → 搜 Depth Fog Pro |
| c | 勾选 ☑️ isEnabled → 效果即时生效 ✅ |
需要"云块掏孔"效果时配置,不需要可跳过:
- 将
Textures/文件夹放入项目Assets/目录(连同VolumeFog/) - Volume →
Depth Fog Pro组件 → 找到 ③ 噪波流云 分类 - 勾选
useNoise开关 - 把 3D 噪波贴图拖入
noiseTexture字段(两个可选,见下表) - 调
noiseContrast(拉到 3~5 云块边界更锐利)
| 贴图 | 分辨率 | 大小 | 特性 | 适合 |
|---|---|---|---|---|
Fog3DNoise.asset |
128³ | 16MB | 低频大块噪波 | 大团云块、推荐首选 |
BuleNoise64.asset |
64³ | 2MB | 高频均匀噪波 | 性能敏感场景、移动端 |
两张 Texture3D 均已随仓库附带,无需自备。64³ 采样更快、内存更小,但云块偏细碎;128³ 云块更大气。
| 想调出 | 调整方式 |
|---|---|
| 整体雾色 | fogColor(建议清晨偏暖/黄昏偏冷,勿纯白) |
| 雾浓不浓 | fogDensity(0.05~0.15 最敏感区间) |
| 近景干净 | startFogDistance(主角周围起雾距离) |
| 山谷沉积雾 | useHeightFog + height + heightPow |
| 云块质感 | useNoise + 拖入 Fog3DNoise.asset + noiseContrast(3~5) |
| 丁达尔光柱 | useVolumetric + anisotropyG(清晨林间建议 0.75) |
📐 展开全部 40+ 参数默认值
| # | 分类 | 参数 | 默认值 |
|---|---|---|---|
| 0 | 全局 | isEnabled |
❌ |
fogColor 雾底色 |
(0.5, 0.6, 0.7) |
||
| 1 | 距离雾 | useDistanceFog |
✔️ |
fogParameter 衰减公式 |
Exp² |
||
startFogDistance |
-17 |
||
endFogDistance |
181.7 |
||
fogDensity 浓度 |
0.098 |
||
useRadialDistance |
✔️ | ||
distanceFogOffset |
0.1 |
||
| 2 | 高度雾 | useHeightFog |
✔️ |
height 基准海平面 |
12 |
||
heightPow 爬坡衰减 |
4 |
||
heightDensity 浓度 |
0.25 |
||
| 3 | 噪波流云 | useNoise |
❌ |
noiseTexture (Texture3D) |
空 | ||
noiseContrast 对比度 |
1 |
||
noiseIntensity |
1 |
||
noiseScale 云块大小 |
(0.3, 0.3, 0.3) |
||
noiseOffset 风速 |
(0.08, 0.01, 0.08) |
||
noiseDistortionStrength |
0.5 |
||
noiseDistortionScale |
(0.1, 0.1, 0.1) |
||
turbulenceSpeed 扰动 |
(0.016, 0.002, 0.016) |
||
noiseDistanceEnd |
86 |
||
noiseEndHardness |
2.79 |
||
| 4 | 天空盒 | useSkyboxFog |
✔️ |
skyboxFogOffset |
-0.11 |
||
skyboxFogHardness |
0.65 |
||
skyboxFogIntensity |
1 |
||
skyboxFill |
0 |
||
| 5 | 太阳体积光 | useSunLight |
✔️ |
useSunColor |
✔️ | ||
sunColor |
(1, 0.9, 0.7) |
||
sunPower 高光锐度 |
6 |
||
sunIntensity 高光强度 |
0.5 |
||
energyLoss 能量守恒 |
0 |
||
useVolumetric 体积光 |
❌ | ||
volumetricSteps 步数 |
12 |
||
anisotropyG 各向异性 |
0.75 |
||
scatteringIntensity 散射 |
1.5 |
||
extinction 消光 |
0.05 |
||
volumetricMaxDistance |
50 |
| 📄 文件 | 🎯 职责 | ✏️ 什么时候改 |
|---|---|---|
DepthFog.shader |
GPU 端:三层雾 + 太阳散射 + 体积光 Raymarch | 新增/修改雾效算法 |
DepthFogVolume.cs |
Volume 面板 40+ 参数定义 | 新增参数 / 改默认值 |
DepthFogFeature.cs |
内含 DepthFogPass + DepthFogFeature |
改执行时机 / 关键字开关 |
| 项目 | 要求 |
|---|---|
| Unity | 2022.3 LTS+ |
| 管线 | Universal Render Pipeline (URP) |
| 平台 | 全平台(噪波云需 Texture3D 支持) |
| 依赖 | 深度纹理(Render Feature 自动开启) |
Q: 加了 Feature 但画面没变化?
检查:① Volume 的 isEnabled 是否勾选 ② Feature 的 Shader 字段是否拖入 ③ 相机是否允许深度纹理。
Q: 体积光开了很卡?
把 volumetricSteps 从 12 降到 6~8,volumetricMaxDistance 从 50 降到 30。体积光是 4 层里最吃性能的,按需开启。
Q: 噪波云块发马赛克?
调高 noiseDistanceEnd(让噪波在更远处才退化)或 noiseEndHardness。马赛克来自 3D 纹理在远处分辨率不足。
Q: 雾太假没有立体感?
打开 useNoise 掏孔 + 调高 noiseContrast(3~5),让云块边界锐利;再开 useVolumetric 拉丁达尔光柱。
Q: 天空被雾糊死了?
skyboxFill 默认 0 是柔和过渡,拉到 1 才会完全糊死。若已糊死请调低 skyboxFogIntensity。
