初始天空盒-2

This commit is contained in:
2026-09-22 00:23:45 +08:00
parent 6e345bc296
commit 22256c6789
3 changed files with 90 additions and 29 deletions
+49
View File
@@ -0,0 +1,49 @@
# 2026-09-22
## 修正云层的透视(world/sky/cartoon_sky.gdshader)
用户指出云的透视不对:球极投影虽然保角、无极点、无缝,但**代价是完全没有空气透视** ——
云从地平线到天顶一样大,看着像一块贴在天上的平顶。这一条是保角投影的固有性质,
不是参数能救的,必须换投影。
### 三种投影的取舍(结论:用软化分母的平面投影)
| 投影 | 半径 | 天顶 | 透视 | 结论 |
|---|---|---|---|---|
| 平面 `dir.xz/dir.y` | 无上限 | 奇点 | 正确(4~6 倍) | 低仰角频率爆炸 → 摩尔纹/地毯 |
| 球极 `dir.xz/(1+dir.y)` | ≤1 | 圆心(安全) | **无** | 平顶感 |
| 软化平面 `dir.xz/(dir.y+k)` | ≤1/k | 安全 | 2~3 倍 | **采用** |
`k`(uniform `cloud_plane_offset`,默认 0.6)是唯一的调节量:
- 半径上限 `1/k` → 噪声频率有界,不会在地平线处爆炸
- 近天顶处 `p ≈ (π/2−e)/(1+k)`,是局部均匀缩放,**不是奇点**,云不会朝一点收拢
- 角尺寸比 地平线:天顶 = `(1+k)/k²`,k=0.6 时约 4.4;云尺寸从 45° 的 17°
平滑降到 10° 的 7.8°
- 方位角方向天然无缝
- 副作用:云的宽高比恒为 1.4~1.7(略扁),对卡通云反而是好事
### 配套的两个抑制
1. **距离细节衰减**:`fbm(p, detail)` 里 `amp *= 0.5 * detail`,`detail = mix(1.0, 0.35, far)`。
远处云的屏幕频率更高,不砍高频倍频会闪烁。
2. **距离云量抑制**:`thresh += far * 0.10`。低仰角处每单位立体角的云数量更多,
不抑制就糊成一片「地毯」。`far = 1.0 - smoothstep(0.06, 0.45, dir.y)`。
最终取值:coverage 0.55 / scale 4.0 / plane_offset 0.60 / horizon_fade 0.08 / edge 0.16。
## 重要:.tres 里的 shader_parameter 会被 Godot 清掉
`cartoon_sky.tres` 被 Godot 重存过一次,`shader_parameter/*` 全部丢失(同时补上了 uid),
天空悄悄退回着色器默认值 —— 而且不会报任何错,只是画面跑偏。
**对策:把调好的美术取值直接写成 uniform 的默认值**,`.tres` 只保留对 shader 的引用。
这样即使参数被清掉,画面也不会变。Inspector 里未覆盖的参数本来就会显示着色器默认值,
所以用起来没区别。
顺带:`.tres` 现在被 Godot 补上了 `uid://bi632suyifms5`,`main.tscn` 里仍按 path 引用,能用。
## 待办 / 可选后续
- 地面还是灰白色 (0.55,0.58,0.62),被天空的蓝色环境光染成了淡紫;另外天空下半球的
`ground_color` (0.29,0.33,0.38) 在地面边缘外露出一条灰带。两处一起调会协调很多。
- `star_amount` 默认 0,太阳落到地平线以下会自动淡入星空,还没实测过夜景。