Files
agame/.workbuddy-ai/memory/2026-09-22.md
T
2026-09-22 00:23:45 +08:00

50 lines
2.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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,太阳落到地平线以下会自动淡入星空,还没实测过夜景。